diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index 207961d45..6d156007f 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -478,9 +478,11 @@ void epicsThreadOnceOsd(epicsThreadOnceId *id, void(*func)(void *), void *arg) if (!initialized) epicsThreadInit(); epicsMutexMustLock(onceMutex); if (*id == 0) { - *id = -1; - func(arg); - *id = 1; + *id = -1; + epicsMutexUnlock(onceMutex); + func(arg); + epicsMutexMustLock(onceMutex); + *id = 1; } else assert(*id > 0 /* func() called epicsThreadOnce() with same id */); epicsMutexUnlock(onceMutex); diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index 04a14f9d2..782db6174 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -1004,7 +1004,9 @@ epicsShareFunc void epicsShareAPI epicsThreadOnceOsd ( if ( *id == 0 ) { *id = -1; + LeaveCriticalSection ( & pGbl->mutex ); ( *func ) ( arg ); + EnterCriticalSection ( & pGbl->mutex ); *id = 1; } else assert(*id > 0 /* func() called epicsThreadOnce() with same id */); diff --git a/src/libCom/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index e6df27f8b..c4cea9563 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -116,7 +116,9 @@ void epicsThreadOnceOsd(epicsThreadOnceId *id, void (*func)(void *), void *arg) assert(semTake(epicsThreadOnceMutex,WAIT_FOREVER)==OK); if (*id == 0) { /* 0 => first call */ *id = -1; /* -1 => func() active */ + semGive(epicsThreadOnceMutex); func(arg); + assert(semTake(epicsThreadOnceMutex,WAIT_FOREVER)==OK); *id = +1; /* +1 => func() done */ } else assert(*id > 0 /* func() called epicsThreadOnce() with same id */);