diff --git a/src/libCom/timer/epicsTimer.h b/src/libCom/timer/epicsTimer.h index a6dfe7351..91188451f 100644 --- a/src/libCom/timer/epicsTimer.h +++ b/src/libCom/timer/epicsTimer.h @@ -46,6 +46,7 @@ public: class epicsTimer { public: + virtual ~epicsTimer () = 0; virtual void start ( epicsTimerNotify &, const epicsTime & ) = 0; virtual void start ( epicsTimerNotify &, double delaySeconds ) = 0; virtual void cancel () = 0; @@ -58,26 +59,22 @@ public: double getExpireDelay (); virtual void show ( unsigned int level ) const = 0; virtual class epicsTimerQueue & getQueue () const = 0; -protected: - virtual ~epicsTimer (); }; class epicsTimerQueue { public: + virtual ~epicsTimerQueue () = 0; virtual epicsTimer & createTimer () = 0; virtual void destroyTimer ( epicsTimer & ) = 0; virtual void show ( unsigned int level ) const = 0; -protected: - virtual ~epicsTimerQueue () = 0; }; class epicsTimerQueueActive : public epicsTimerQueue { public: + virtual ~epicsTimerQueueActive () = 0; static epicsShareFunc epicsTimerQueueActive & allocate ( bool okToShare, int threadPriority = epicsThreadPriorityMin + 10 ); virtual void release () = 0; -protected: - virtual ~epicsTimerQueueActive () = 0; }; class epicsTimerQueueNotify { diff --git a/src/libCom/timer/timer.cpp b/src/libCom/timer/timer.cpp index b541b2df9..1e4d2ed3c 100644 --- a/src/libCom/timer/timer.cpp +++ b/src/libCom/timer/timer.cpp @@ -179,7 +179,7 @@ void timer::show ( unsigned int level ) const epicsTimerQueue & timer::getQueue () const { - return this->queue.getEpicsTimerQueue (); + return this->queue; } timerQueue & timer::getPrivTimerQueue() diff --git a/src/libCom/timer/timerPrivate.h b/src/libCom/timer/timerPrivate.h index bdf636af7..26b8ac741 100644 --- a/src/libCom/timer/timerPrivate.h +++ b/src/libCom/timer/timerPrivate.h @@ -77,14 +77,14 @@ private: friend class timerQueue; }; -class timerQueue { +class timerQueue : public epicsTimerQueue { public: timerQueue ( epicsTimerQueueNotify ¬ify ); virtual ~timerQueue (); double process ( const epicsTime & currentTime ); + epicsTimer & createTimer (); + void destroyTimer ( epicsTimer & ); void show ( unsigned int level ) const; - timer & createTimer (); - void destroyTimer ( timer & ); epicsTimerForC & createTimerForC ( epicsTimerCallback, void *pPrivateIn ); void destroyTimerForC ( epicsTimerForC & ); private: @@ -97,7 +97,6 @@ private: timer *pExpireTmr; epicsThreadId processThread; bool cancelPending; - virtual epicsTimerQueue & getEpicsTimerQueue () = 0; friend class timer; }; @@ -113,7 +112,7 @@ private: class timerQueueActive : public epicsTimerQueueActive, public epicsThreadRunable, public epicsTimerQueueNotify, - public timerQueueActiveMgrPrivate, private timerQueue { + public timerQueueActiveMgrPrivate { public: timerQueueActive ( bool okToShare, unsigned priority ); ~timerQueueActive () = 0; @@ -125,6 +124,7 @@ public: epicsTimerForC & createTimerForC ( epicsTimerCallback, void *pPrivateIn ); void destroyTimerForC ( epicsTimerForC & ); private: + timerQueue queue; epicsEvent rescheduleEvent; epicsEvent exitEvent; epicsThread thread; @@ -163,8 +163,7 @@ private: extern timerQueueActiveMgr queueMgr; -class timerQueuePassive : public epicsTimerQueuePassive, - private timerQueue { +class timerQueuePassive : public epicsTimerQueuePassive { public: timerQueuePassive ( epicsTimerQueueNotify & ); epicsTimer & createTimer (); @@ -174,6 +173,7 @@ public: epicsTimerForC & createTimerForC ( epicsTimerCallback, void *pPrivateIn ); void destroyTimerForC ( epicsTimerForC & ); protected: + timerQueue queue; ~timerQueuePassive (); epicsTimerQueue & getEpicsTimerQueue (); }; diff --git a/src/libCom/timer/timerQueue.cpp b/src/libCom/timer/timerQueue.cpp index aa10c2a8d..1fa10a5a2 100644 --- a/src/libCom/timer/timerQueue.cpp +++ b/src/libCom/timer/timerQueue.cpp @@ -153,7 +153,7 @@ double timerQueue::process ( const epicsTime & currentTime ) } } -timer & timerQueue::createTimer () +epicsTimer & timerQueue::createTimer () { epicsAutoMutex autoLock ( this->mutex ); void *pBuf = this->timerFreeList.allocate ( sizeof (timer) ); @@ -163,10 +163,10 @@ timer & timerQueue::createTimer () return * new ( pBuf ) timer ( *this ); } -void timerQueue::destroyTimer ( timer & tmr ) +void timerQueue::destroyTimer ( epicsTimer & tmr ) { epicsAutoMutex autoLock ( this->mutex ); - tmr.~timer (); + tmr.~epicsTimer (); this->timerFreeList.release ( &tmr, sizeof( tmr ) ); } diff --git a/src/libCom/timer/timerQueueActive.cpp b/src/libCom/timer/timerQueueActive.cpp index 75c543f89..4308caaba 100644 --- a/src/libCom/timer/timerQueueActive.cpp +++ b/src/libCom/timer/timerQueueActive.cpp @@ -41,8 +41,7 @@ epicsTimerQueueActive &epicsTimerQueueActive::allocate ( bool okToShare, int thr } timerQueueActive::timerQueueActive ( bool okToShareIn, unsigned priority ) : - timerQueue ( static_cast ( *this ) ), - thread ( *this, "epicsTimerQueueActive", + queue ( *this ), thread ( *this, "epicsTimerQueueActive", epicsThreadGetStackSize ( epicsThreadStackMedium ), priority ), okToShare ( okToShareIn ), exitFlag ( false ), terminateFlag ( false ) { @@ -64,7 +63,7 @@ void timerQueueActive::run () { this->exitFlag = false; while ( ! this->terminateFlag ) { - double delay = this->timerQueue::process ( epicsTime::getCurrent() ); + double delay = this->queue.process ( epicsTime::getCurrent() ); debugPrintf ( ( "timer thread sleeping for %g sec (max)\n", delay ) ); this->rescheduleEvent.wait ( delay ); } @@ -74,23 +73,23 @@ void timerQueueActive::run () epicsTimer & timerQueueActive::createTimer () { - return this->timerQueue::createTimer (); + return this->queue.createTimer (); } void timerQueueActive::destroyTimer ( epicsTimer & et ) { timer & tmr = dynamic_cast < timer & > ( et ); - this->timerQueue::destroyTimer ( tmr ); + this->queue.destroyTimer ( tmr ); } epicsTimerForC & timerQueueActive::createTimerForC ( epicsTimerCallback pCB, void *pPrivateIn ) { - return this->timerQueue::createTimerForC ( pCB, pPrivateIn ); + return this->queue.createTimerForC ( pCB, pPrivateIn ); } void timerQueueActive::destroyTimerForC ( epicsTimerForC &tmr ) { - this->timerQueue::destroyTimerForC ( tmr ); + this->queue.destroyTimerForC ( tmr ); } void timerQueueActive::reschedule () @@ -103,7 +102,7 @@ void timerQueueActive::show ( unsigned int level ) const printf ( "EPICS threaded timer queue at %p\n", static_cast ( this ) ); if ( level >=1u ) { - this->timerQueue::show ( level - 1u ); + this->queue.show ( level - 1u ); printf ( "reschedule event\n" ); this->rescheduleEvent.show ( level - 1u ); printf ( "exit event\n" ); diff --git a/src/libCom/timer/timerQueuePassive.cpp b/src/libCom/timer/timerQueuePassive.cpp index 57b880e14..2b8ca8a7a 100644 --- a/src/libCom/timer/timerQueuePassive.cpp +++ b/src/libCom/timer/timerQueuePassive.cpp @@ -51,34 +51,34 @@ epicsTimerQueuePassive &epicsTimerQueuePassive::create ( epicsTimerQueueNotify & } timerQueuePassive::timerQueuePassive ( epicsTimerQueueNotify ¬ifyIn ) : - timerQueue ( notifyIn ) {} + queue ( notifyIn ) {} timerQueuePassive::~timerQueuePassive () {} epicsTimer & timerQueuePassive::createTimer () { - return this->timerQueue::createTimer (); + return this->queue.createTimer (); } void timerQueuePassive::destroyTimer ( epicsTimer & et ) { timer & tmr = dynamic_cast < timer & > ( et ); - this->timerQueue::destroyTimer ( tmr ); + this->queue.destroyTimer ( tmr ); } epicsTimerForC & timerQueuePassive::createTimerForC ( epicsTimerCallback pCB, void *pPrivateIn ) { - return this->timerQueue::createTimerForC ( pCB, pPrivateIn ); + return this->queue.createTimerForC ( pCB, pPrivateIn ); } void timerQueuePassive::destroyTimerForC ( epicsTimerForC &tmr ) { - this->timerQueue::destroyTimerForC ( tmr ); + this->queue.destroyTimerForC ( tmr ); } double timerQueuePassive::process ( const epicsTime & currentTime ) { - return this->timerQueue::process ( currentTime ); + return this->queue.process ( currentTime ); } void timerQueuePassive::show ( unsigned int level ) const @@ -86,7 +86,7 @@ void timerQueuePassive::show ( unsigned int level ) const printf ( "EPICS non-threaded timer queue at %p\n", static_cast ( this ) ); if ( level >=1u ) { - this->timerQueue::show ( level - 1u ); + this->queue.show ( level - 1u ); } }