diff --git a/src/libCom/cxxTemplates/epicsSingleton.h b/src/libCom/cxxTemplates/epicsSingleton.h index 5a1fa7b38..472a21ff9 100644 --- a/src/libCom/cxxTemplates/epicsSingleton.h +++ b/src/libCom/cxxTemplates/epicsSingleton.h @@ -20,7 +20,6 @@ protected: void * singletonPointer () const; private: void * pSingleton; - static class epicsMutex mutex; virtual void * factory () = 0; }; diff --git a/src/libCom/cxxTemplates/epicsSingletonBase.cpp b/src/libCom/cxxTemplates/epicsSingletonBase.cpp index 4e6c552b0..f2f3a5be8 100644 --- a/src/libCom/cxxTemplates/epicsSingletonBase.cpp +++ b/src/libCom/cxxTemplates/epicsSingletonBase.cpp @@ -10,9 +10,22 @@ #define epicsExportSharedSymbols #include "epicsMutex.h" #include "epicsGuard.h" +#include "epicsThread.h" #include "epicsSingleton.h" -epicsMutex epicsSingletonBase::mutex; +static epicsThreadOnceId epicsSingletonOnceId = EPICS_THREAD_ONCE_INIT; +static epicsMutex *pSingletonBaseMutexEPICS; + +static void epicsSingletonCleanup () +{ + delete pSingletonBaseMutexEPICS; +} + +static void epicsSingletonOnce ( void * ) +{ + pSingletonBaseMutexEPICS = new epicsMutex; + atexit ( epicsSingletonCleanup ); +} epicsSingletonBase::epicsSingletonBase () : pSingleton ( 0 ) { @@ -29,8 +42,11 @@ epicsSingletonBase::~epicsSingletonBase () void epicsSingletonBase::lockedFactory () { - epicsGuard < epicsMutex > guard ( this->mutex ); if ( ! this->pSingleton ) { - this->pSingleton = this->factory (); + epicsThreadOnce ( & epicsSingletonOnceId, epicsSingletonOnce, 0 ); + epicsGuard < epicsMutex > guard ( *pSingletonBaseMutexEPICS ); + if ( ! this->pSingleton ) { + this->pSingleton = this->factory (); + } } } \ No newline at end of file