diff --git a/src/iec61850/inc_private/mms_mapping_internal.h b/src/iec61850/inc_private/mms_mapping_internal.h index 3e896495..95727449 100644 --- a/src/iec61850/inc_private/mms_mapping_internal.h +++ b/src/iec61850/inc_private/mms_mapping_internal.h @@ -325,7 +325,10 @@ struct sMmsMapping { /* flag indicates if data model is locked --> prevents reports to be sent */ bool isModelLocked; + +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore isModelLockedMutex; +#endif /* (CONFIG_MMS_THREADLESS_STACK != 1) */ IedServer iedServer; diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index f09e42b2..0253bcf1 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -814,11 +814,15 @@ IedServer_lockDataModel(IedServer self) { MmsServer_lockModel(self->mmsServer); +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->mmsMapping->isModelLockedMutex); +#endif self->mmsMapping->isModelLocked = true; +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->mmsMapping->isModelLockedMutex); +#endif } void @@ -832,13 +836,17 @@ IedServer_unlockDataModel(IedServer self) /* check if reports have to be sent! */ Reporting_processReportEventsAfterUnlock(self->mmsMapping); +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->mmsMapping->isModelLockedMutex); +#endif MmsServer_unlockModel(self->mmsServer); self->mmsMapping->isModelLocked = false; +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->mmsMapping->isModelLockedMutex); +#endif } #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 096c90c7..14501840 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -3670,7 +3670,9 @@ MmsMapping_triggerReportObservers(MmsMapping* self, MmsValue* value, int flag) { LinkedList element = self->reportControls; +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->isModelLockedMutex); +#endif bool modelLocked = self->isModelLocked; @@ -3708,7 +3710,9 @@ MmsMapping_triggerReportObservers(MmsMapping* self, MmsValue* value, int flag) Reporting_processReportEventsAfterUnlock(self); } +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->isModelLockedMutex); +#endif } #endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */ @@ -3729,13 +3733,17 @@ MmsMapping_triggerGooseObservers(MmsMapping* self, MmsValue* value) if (DataSet_isMemberValue(dataSet, value, NULL)) { MmsGooseControlBlock_setStateChangePending(gcb); +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->isModelLockedMutex); +#endif if (self->isModelLocked == false) { MmsGooseControlBlock_publishNewState(gcb); } +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->isModelLockedMutex); +#endif } } } diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index ad60bef3..bada2732 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -3877,7 +3877,9 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs) void Reporting_processReportEvents(MmsMapping* self, uint64_t currentTimeInMs) { +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->isModelLockedMutex); +#endif if (self->isModelLocked == false) { @@ -3894,7 +3896,9 @@ Reporting_processReportEvents(MmsMapping* self, uint64_t currentTimeInMs) } } +#if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->isModelLockedMutex); +#endif } /*