From 836fe5dbb072340f3740e77ff2f85e9722c84102 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Tue, 26 Mar 2002 01:35:54 +0000 Subject: [PATCH] use epicsThreadOnce so that we are not dependent on static member data --- src/libCom/cxxTemplates/epicsSingleton.h | 1 - .../cxxTemplates/epicsSingletonBase.cpp | 22 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) 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