From 91bb816621fede5ccacf525631e08a478fa11241 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 12 Apr 2021 08:02:24 +0200 Subject: [PATCH] - updated macos semaphore handling - updated CHANGELOG --- CHANGELOG | 25 ++++++++++++++ hal/thread/macos/thread_macos.c | 58 +++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0ea01043..d69c0705 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,31 @@ Changes to version 1.5.0 - IEC 61850 server: control models - allow delaying select response with check handler (new handler return value CONTROL_WAITING_FOR_SELECT) - added support for server to listen on multiple ports - added support for service tracking +- added tool support for transient data objects +- .NET API: added more functions to create and access server data model +- IED server - control model - send AddCause with operate- for DOes, SBOes control models +- IED server: integrated GOOSE publisher - lock data model during GOOSE retransmission to avoid corrupted GOOSE data +- added server example for dead band handling +- IED server: make presence of RCB.Owner configurable at runtime with function IedServerConfig_enableOwnerForRCB (B1502/S1634) +- IED server: make presence of BRCB.ResvTms configurable at runtime with function IedServerConfig_enableResvTmsForBRCB (F1558) +- restrict maximum recursion depth in BerDecoder_decodeLength when indefinite length encoding is used to avoid stack overflow when receiving malformed messages +- fixed oss-fuzz issues 31399, 31340, 31341, 31344, 31346 +- IED server: fixed bug in log service - old-entry and old-entry-time not updated +- IED server: added new function IedServer_handleWriteAccessForComplexAttribute. Changed WriteAccessHandler behavior when ACCESS_POLICY_ALLOW. +- MMS server: add compile time configuration options to enable/disable fileDelete and fileRename services (fileRename is now disabled by default) +- MMS server: better data model lock handling for performance improvements +- Linux - Ethernet: replace IFF_PROMISC by IFF_ALLMULTI +- improvements in Python wrapper code +- IED server: control models - fixed bug that only one control is unselected when connection closes +- IED server: fixed bug - logs (journals) are added to all logical devices instead of just the parents +- IED Server: prevent integrated GOOSE publisher to crash when ethernet socket cannot be created +- IED server: make compatible with tissue 1178 +- IED server: reporting - implemented behavior according to tissue 1432 +- IED server: WriteAccessHandler can tell the stack not to update the value when returning DATA_ACCESS_ERROR_SUCCESS_NO_UPDATE +- IED server: fixed problem that BL FC is not writable (#287) +- IEC 61850 client: fixed dead lock in IedConnection_getFileAsync when fileRead times out (#285) +- IED server: added ControlSelectStateChangedHandler callback for control mode + Changes to version 1.4.2.1 -------------------------- diff --git a/hal/thread/macos/thread_macos.c b/hal/thread/macos/thread_macos.c index e51035d7..64d9a6dd 100644 --- a/hal/thread/macos/thread_macos.c +++ b/hal/thread/macos/thread_macos.c @@ -28,43 +28,75 @@ struct sThread { bool autodestroy; }; +typedef struct sSemaphore* mSemaphore; + +struct sSemaphore +{ + sem_t* sem; +}; + Semaphore Semaphore_create(int initialValue) { + mSemaphore self = NULL; + char tmpname[] = {"/tmp/libiec61850.XXXXXX"}; - mktemp(tmpname); + char* res = mktemp(tmpname); - Semaphore self = (Semaphore) sem_open(tmpname, O_CREAT, 0666, initialValue); + if (res) { + self = (mSemaphore) GLOBAL_CALLOC(1, sizeof(struct sSemaphore)); - if (self == SEM_FAILED) { - printf("ERROR: Failed to create semaphore (errno = %i)\n", errno); - } - - int ret = sem_unlink(tmpname); + if (self) { + self->sem = sem_open(tmpname, O_CREAT, 0666, initialValue); + + if (self->sem == SEM_FAILED) { + printf("ERROR: Failed to create semaphore (errno = %i)\n", errno); - if (ret == -1) - printf("ERROR: Failed to unlink semaphore %s\n", tmpname); + GLOBAL_FREEMEM(self); + self = NULL; + } + else { + int ret = sem_unlink(tmpname); - return self; + if (ret == -1) + printf("ERROR: Failed to unlink semaphore %s\n", tmpname); + } + } + } + + return (Semaphore)self; } /* Wait until semaphore value is more than zero. Then decrease the semaphore value. */ void Semaphore_wait(Semaphore self) { - sem_wait((sem_t*) self); + mSemaphore mSelf = (mSemaphore) self; + + sem_wait(mSelf->sem); } void Semaphore_post(Semaphore self) { - sem_post((sem_t*) self); + mSemaphore mSelf = (mSemaphore) self; + + sem_post(mSelf->sem); } void Semaphore_destroy(Semaphore self) { - sem_close(self); + if (self) { + mSemaphore mSelf = (mSemaphore) self; + + int ret = sem_close(mSelf->sem); + + if (ret == -1) + printf("ERROR: Failed to close semaphore (errno = %i)\n", errno); + + GLOBAL_FREEMEM(mSelf); + } } Thread