From df39142335d9701de5c11308c75e86f063d3e781 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 24 Jun 2008 20:59:55 +0000 Subject: [PATCH] epicsThreadOnceOsd() must unlock mutex before calling func(). Required so callbackInit() can wait for its threads to start. --- src/libCom/osi/os/RTEMS/osdThread.c | 8 +++++--- src/libCom/osi/os/WIN32/osdThread.c | 2 ++ src/libCom/osi/os/vxWorks/osdThread.c | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) 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 */);