diff --git a/src/libCom/timer/epicsTimer.cpp b/src/libCom/timer/epicsTimer.cpp index 5cbe0f01a..759c16eb5 100644 --- a/src/libCom/timer/epicsTimer.cpp +++ b/src/libCom/timer/epicsTimer.cpp @@ -30,36 +30,12 @@ #define epicsExportSharedSymbols #include "epicsTimer.h" +#include "epicsGuard.h" #include "timerPrivate.h" -struct epicsTimerQueuePassiveForC : public epicsTimerQueueNotify, public timerQueuePassive { -public: - epicsTimerQueuePassiveForC ( epicsTimerQueueRescheduleCallback pCallback, void *pPrivate ); - void destroy (); - void * operator new ( size_t size ); - void operator delete ( void *pCadaver, size_t size ); -protected: - virtual ~epicsTimerQueuePassiveForC (); -private: - epicsTimerQueueRescheduleCallback pCallback; - void *pPrivate; - void reschedule (); - static tsFreeList < epicsTimerQueuePassiveForC > freeList; - static epicsMutex freeListMutex; -}; - -#if defined ( _MSC_VER ) -# pragma warning ( push ) -# pragma warning ( disable: 4660 ) -#endif - -template class tsFreeList < epicsTimerForC, 32, 0 >; -template class tsFreeList < epicsTimerQueueActiveForC, 1024, 0 >; -template class tsFreeList < epicsTimerQueuePassiveForC, 1024, 0 >; - -#if defined ( _MSC_VER ) -# pragma warning ( pop ) -#endif +epicsSingleton < tsFreeList < epicsTimerForC, 0x20 > > epicsTimerForC::pFreeList; +epicsSingleton < tsFreeList < epicsTimerQueuePassiveForC, 0x10 > > epicsTimerQueuePassiveForC::pFreeList; +epicsSingleton < tsFreeList < epicsTimerQueueActiveForC, 0x10 > > epicsTimerQueueActiveForC::pFreeList; epicsTimer::~epicsTimer () {} @@ -76,9 +52,9 @@ epicsTimerForC::~epicsTimerForC () { } -inline void epicsTimerForC::destroy () +void epicsTimerForC::destroy () { - this->getPrivTimerQueue().destroyTimerForC ( *this ); + delete this; } epicsTimerNotify::expireStatus epicsTimerForC::expire ( const epicsTime & ) @@ -87,9 +63,6 @@ epicsTimerNotify::expireStatus epicsTimerForC::expire ( const epicsTime & ) return noRestart; } -tsFreeList < epicsTimerQueueActiveForC > epicsTimerQueueActiveForC::freeList; -epicsMutex epicsTimerQueueActiveForC::freeListMutex; - epicsTimerQueueActiveForC::epicsTimerQueueActiveForC ( bool okToShare, unsigned priority ) : timerQueueActive ( okToShare, priority ) { @@ -104,21 +77,6 @@ void epicsTimerQueueActiveForC::release () queueMgr.release ( *this ); } -tsFreeList < epicsTimerQueuePassiveForC > epicsTimerQueuePassiveForC::freeList; -epicsMutex epicsTimerQueuePassiveForC::freeListMutex; - -inline void * epicsTimerQueuePassiveForC::operator new ( size_t size ) -{ - epicsAutoMutex locker ( epicsTimerQueuePassiveForC::freeListMutex ); - return epicsTimerQueuePassiveForC::freeList.allocate ( size ); -} - -inline void epicsTimerQueuePassiveForC::operator delete ( void *pCadaver, size_t size ) -{ - epicsAutoMutex locker ( epicsTimerQueuePassiveForC::freeListMutex ); - epicsTimerQueuePassiveForC::freeList.release ( pCadaver, size ); -} - epicsTimerQueuePassiveForC::epicsTimerQueuePassiveForC ( epicsTimerQueueRescheduleCallback pCallbackIn, void * pPrivateIn ) : timerQueuePassive ( * static_cast < epicsTimerQueueNotify * > ( this ) ), @@ -135,7 +93,7 @@ void epicsTimerQueuePassiveForC::reschedule () (*this->pCallback) ( this->pPrivate ); } -inline void epicsTimerQueuePassiveForC::destroy () +void epicsTimerQueuePassiveForC::destroy () { delete this; } @@ -144,7 +102,7 @@ extern "C" epicsTimerQueuePassiveId epicsShareAPI epicsTimerQueuePassiveCreate ( epicsTimerQueueRescheduleCallback pCallbackIn, void *pPrivateIn ) { try { - return new epicsTimerQueuePassiveForC ( pCallbackIn, pPrivateIn ); + return new epicsTimerQueuePassiveForC ( pCallbackIn, pPrivateIn ); } catch ( ... ) { return 0; @@ -167,7 +125,7 @@ extern "C" epicsTimerId epicsShareAPI epicsTimerQueuePassiveCreateTimer ( epicsTimerQueuePassiveId pQueue, epicsTimerCallback pCallback, void *pArg ) { try { - return & pQueue->createTimerForC ( pCallback, pArg ); + return & pQueue->createTimerForC ( pCallback, pArg ); } catch ( ... ) { return 0;