- updated macos semaphore handling

- updated CHANGELOG
pull/331/head
Michael Zillgith 4 years ago
parent 72feb2f614
commit 91bb816621

@ -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
--------------------------

@ -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

Loading…
Cancel
Save