- IED server: fixed - segmentation fault when compiled with CONFIG_MMS_THREADLESS_STACK (LIB61850-398)

v1.6_develop_417_rbac2
Michael Zillgith 2 years ago
parent 9fa68a9d93
commit 5b34251030

@ -325,7 +325,10 @@ struct sMmsMapping {
/* flag indicates if data model is locked --> prevents reports to be sent */ /* flag indicates if data model is locked --> prevents reports to be sent */
bool isModelLocked; bool isModelLocked;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore isModelLockedMutex; Semaphore isModelLockedMutex;
#endif /* (CONFIG_MMS_THREADLESS_STACK != 1) */
IedServer iedServer; IedServer iedServer;

@ -911,11 +911,15 @@ IedServer_lockDataModel(IedServer self)
{ {
MmsServer_lockModel(self->mmsServer); MmsServer_lockModel(self->mmsServer);
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->mmsMapping->isModelLockedMutex); Semaphore_wait(self->mmsMapping->isModelLockedMutex);
#endif
self->mmsMapping->isModelLocked = true; self->mmsMapping->isModelLocked = true;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->mmsMapping->isModelLockedMutex); Semaphore_post(self->mmsMapping->isModelLockedMutex);
#endif
} }
void void
@ -929,13 +933,17 @@ IedServer_unlockDataModel(IedServer self)
/* check if reports have to be sent! */ /* check if reports have to be sent! */
Reporting_processReportEventsAfterUnlock(self->mmsMapping); Reporting_processReportEventsAfterUnlock(self->mmsMapping);
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->mmsMapping->isModelLockedMutex); Semaphore_wait(self->mmsMapping->isModelLockedMutex);
#endif
MmsServer_unlockModel(self->mmsServer); MmsServer_unlockModel(self->mmsServer);
self->mmsMapping->isModelLocked = false; self->mmsMapping->isModelLocked = false;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->mmsMapping->isModelLockedMutex); Semaphore_post(self->mmsMapping->isModelLockedMutex);
#endif
} }
#if (CONFIG_IEC61850_CONTROL_SERVICE == 1) #if (CONFIG_IEC61850_CONTROL_SERVICE == 1)

@ -3721,7 +3721,9 @@ MmsMapping_triggerReportObservers(MmsMapping* self, MmsValue* value, int flag)
{ {
LinkedList element = self->reportControls; LinkedList element = self->reportControls;
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->isModelLockedMutex); Semaphore_wait(self->isModelLockedMutex);
#endif
bool modelLocked = self->isModelLocked; bool modelLocked = self->isModelLocked;
@ -3759,7 +3761,9 @@ MmsMapping_triggerReportObservers(MmsMapping* self, MmsValue* value, int flag)
Reporting_processReportEventsAfterUnlock(self); Reporting_processReportEventsAfterUnlock(self);
} }
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->isModelLockedMutex); Semaphore_post(self->isModelLockedMutex);
#endif
} }
#endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */
@ -3780,13 +3784,17 @@ MmsMapping_triggerGooseObservers(MmsMapping* self, MmsValue* value)
if (DataSet_isMemberValue(dataSet, value, NULL)) { if (DataSet_isMemberValue(dataSet, value, NULL)) {
MmsGooseControlBlock_setStateChangePending(gcb); MmsGooseControlBlock_setStateChangePending(gcb);
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->isModelLockedMutex); Semaphore_wait(self->isModelLockedMutex);
#endif
if (self->isModelLocked == false) { if (self->isModelLocked == false) {
MmsGooseControlBlock_publishNewState(gcb); MmsGooseControlBlock_publishNewState(gcb);
} }
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->isModelLockedMutex); Semaphore_post(self->isModelLockedMutex);
#endif
} }
} }
} }

@ -3891,7 +3891,9 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs)
void void
Reporting_processReportEvents(MmsMapping* self, uint64_t currentTimeInMs) Reporting_processReportEvents(MmsMapping* self, uint64_t currentTimeInMs)
{ {
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->isModelLockedMutex); Semaphore_wait(self->isModelLockedMutex);
#endif
if (self->isModelLocked == false) { if (self->isModelLocked == false) {
@ -3908,7 +3910,9 @@ Reporting_processReportEvents(MmsMapping* self, uint64_t currentTimeInMs)
} }
} }
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->isModelLockedMutex); Semaphore_post(self->isModelLockedMutex);
#endif
} }
/* /*

Loading…
Cancel
Save