- fixed locking mechanism in logging.c (LIB61850-327)

pull/396/head
Michael Zillgith 3 years ago
parent b3868a2f9f
commit a4fdf089bb

@ -1,7 +1,7 @@
/* /*
* logging.h * logging.h
* *
* Copyright 2016 Michael Zillgith * Copyright 2016-2022 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -29,7 +29,9 @@ typedef struct {
char* name; char* name;
LogicalNode* parentLN; LogicalNode* parentLN;
bool locked; #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore lock;
#endif
LogStorage logStorage; LogStorage logStorage;

@ -52,7 +52,10 @@ LogInstance_create(LogicalNode* parentLN, const char* name)
self->name = StringUtils_copyString(name); self->name = StringUtils_copyString(name);
self->parentLN = parentLN; self->parentLN = parentLN;
self->logStorage = NULL; self->logStorage = NULL;
self->locked = false;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
self->lock = Semaphore_create(1);
#endif
self->oldEntryId = 0; self->oldEntryId = 0;
self->oldEntryTime = 0; self->oldEntryTime = 0;
@ -67,6 +70,10 @@ void
LogInstance_destroy(LogInstance* self) LogInstance_destroy(LogInstance* self)
{ {
if (self) { if (self) {
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_destroy(self->lock);
#endif
GLOBAL_FREEMEM(self->name); GLOBAL_FREEMEM(self->name);
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }
@ -79,10 +86,9 @@ LogInstance_logSingleData(LogInstance* self, const char* dataRef, MmsValue* valu
if (logStorage != NULL) { if (logStorage != NULL) {
while (self->locked) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Thread_sleep(1); Semaphore_wait(self->lock);
#endif
self->locked = true;
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: Log value - dataRef: %s flag: %i\n", dataRef, flag); printf("IED_SERVER: Log value - dataRef: %s flag: %i\n", dataRef, flag);
@ -95,17 +101,21 @@ LogInstance_logSingleData(LogInstance* self, const char* dataRef, MmsValue* valu
uint8_t* data = (uint8_t*) GLOBAL_MALLOC(dataSize); uint8_t* data = (uint8_t*) GLOBAL_MALLOC(dataSize);
if (data) {
MmsValue_encodeMmsData(value, data, 0, true); MmsValue_encodeMmsData(value, data, 0, true);
LogStorage_addEntryData(logStorage, entryID, dataRef, data, dataSize, flag); LogStorage_addEntryData(logStorage, entryID, dataRef, data, dataSize, flag);
self->locked = false;
GLOBAL_FREEMEM(data); GLOBAL_FREEMEM(data);
}
self->newEntryId = entryID; self->newEntryId = entryID;
self->newEntryTime = timestamp; self->newEntryTime = timestamp;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->lock);
#endif
} }
else else
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
@ -119,10 +129,9 @@ LogInstance_logEntryStart(LogInstance* self)
if (logStorage != NULL) { if (logStorage != NULL) {
while (self->locked) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Thread_sleep(1); Semaphore_wait(self->lock);
#endif
self->locked = true;
uint64_t timestamp = Hal_getTimeInMs(); uint64_t timestamp = Hal_getTimeInMs();
@ -143,20 +152,20 @@ LogInstance_logEntryData(LogInstance* self, uint64_t entryID, const char* dataRe
{ {
LogStorage logStorage = self->logStorage; LogStorage logStorage = self->logStorage;
if (logStorage != NULL) { if (logStorage) {
int dataSize = MmsValue_encodeMmsData(value, NULL, 0, false); int dataSize = MmsValue_encodeMmsData(value, NULL, 0, false);
uint8_t* data = (uint8_t*) GLOBAL_MALLOC(dataSize); uint8_t* data = (uint8_t*) GLOBAL_MALLOC(dataSize);
if (data) {
MmsValue_encodeMmsData(value, data, 0, true); MmsValue_encodeMmsData(value, data, 0, true);
LogStorage_addEntryData(logStorage, entryID, dataRef, data, dataSize, flag); LogStorage_addEntryData(logStorage, entryID, dataRef, data, dataSize, flag);
self->locked = false;
GLOBAL_FREEMEM(data); GLOBAL_FREEMEM(data);
} }
}
} }
void void
@ -164,7 +173,9 @@ LogInstance_logEntryFinished(LogInstance* self, uint64_t entryID)
{ {
(void)entryID; (void)entryID;
self->locked = false; #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->lock);
#endif
} }
void void
@ -989,6 +1000,8 @@ LogControl_logAllDatasetEntries(LogControl* self, const char* iedName)
uint64_t entryID = LogInstance_logEntryStart(log); uint64_t entryID = LogInstance_logEntryStart(log);
if (entryID != 0) {
DataSetEntry* dataSetEntry = self->dataSet->fcdas; DataSetEntry* dataSetEntry = self->dataSet->fcdas;
while (dataSetEntry != NULL) { while (dataSetEntry != NULL) {
@ -1001,6 +1014,7 @@ LogControl_logAllDatasetEntries(LogControl* self, const char* iedName)
} }
LogInstance_logEntryFinished(log, entryID); LogInstance_logEntryFinished(log, entryID);
}
} }
} }

@ -1344,6 +1344,8 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
else if (!strcmp(modelNode->name, "BacTrk")) else if (!strcmp(modelNode->name, "BacTrk"))
actInstance = &self->bacTrk; actInstance = &self->bacTrk;
if (actInstance)
{
if (*actInstance != NULL) { if (*actInstance != NULL) {
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: ERROR: multiple %s instances found in server\n", modelNode->name); printf("IED_SERVER: ERROR: multiple %s instances found in server\n", modelNode->name);
@ -1358,7 +1360,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
getControlTrackingAttributes(*actInstance, actTrk); getControlTrackingAttributes(*actInstance, actTrk);
} }
} }
}
} }
else if (!strcmp(modelNode->name, "BrcbTrk")) { else if (!strcmp(modelNode->name, "BrcbTrk")) {
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)

Loading…
Cancel
Save