diff --git a/src/libCom/timer/epicsTimer.h b/src/libCom/timer/epicsTimer.h index f01ea0b3d..7b4865577 100644 --- a/src/libCom/timer/epicsTimer.h +++ b/src/libCom/timer/epicsTimer.h @@ -1,6 +1,6 @@ /* epicsTimer.h */ -/* Author: Jeffrey O. Hill */ +/* Authors: Marty Kraimer, Jeff Hill */ /********************COPYRIGHT NOTIFICATION********************************** This software was developed under a United States Government license @@ -11,90 +11,129 @@ of this distribution. #ifndef epicsTimerH #define epicsTimerH -#include "epicsAssert.h" +#include + #include "shareLib.h" +#include "epicsAssert.h" #include "epicsTime.h" #include "epicsThread.h" #ifdef __cplusplus -class epicsTimerExpireStatus{ -public: - bool again; // Is this a periodic timer? That is reschedule - double delay; //If again is true the delay until expire is called again - epicsTimerExpireStatus() : again(false), delay(0.0) {} - epicsTimerExpireStatus(bool a,double d) : again(a), delay(d) {} -}; - // code using a timer must implement epicsTimerNotify -class epicsTimerNotify { +class epicsShareClass epicsTimerNotify { public: - virtual epicsTimerExpireStatus expire() = 0; - virtual void show(unsigned int level); -}; - -class epicsShareClass epicsTimerQueue { -public: - static epicsTimerQueue &createNonThreaded(); - static epicsTimerQueue &createThreaded( - bool okToShare, int threadPriority = threadPriorityMin+10); - static destroy(epicsTimerQueue &); - virtual void process() = 0; - virtual epicsTime getExpireTime() const = 0; - virtual void show(unsigned int level) const = 0; + enum restart_t { noRestart, restart }; + class expireStatus { + public: + expireStatus ( restart_t ); + expireStatus ( restart_t, const double &expireDelaySec ); + bool restart () const; + double expirationDelay () const; + private: + bool again; + double delay; + }; + // return noRestart OR return expireStatus ( restart, 30.0 /* sec */ ); + virtual expireStatus expire () = 0; + virtual void show ( unsigned int level ) const; }; class epicsShareClass epicsTimer { public: - static epicsTimer& create(epicsTimerNotify &,epicsTimerQueue&); - static destroy(epicsTimer&); - virtual void start(epicsTime &) = 0; - virtual void start(double delaySeconds) = 0; - virtual virtual void cancel() = 0; - virtual epicsTime getExpireTime() const = 0; - virtual bool isExpired() const = 0; - virtual void show(unsigned int level) const = 0; + virtual ~epicsTimer () = 0; + virtual void start ( const epicsTime & ) = 0; + virtual void start ( double delaySeconds ) = 0; + virtual void cancel () = 0; + virtual double getExpireDelay () const = 0; + virtual void show ( unsigned int level ) const = 0; }; + +class epicsShareClass epicsTimerQueueThreaded { +public: + static epicsTimerQueueThreaded & create ( + bool okToShare, int threadPriority = epicsThreadPriorityMin + 10 ); + virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0; + virtual void show ( unsigned int level ) const = 0; + virtual void release () = 0; +protected: + virtual ~epicsTimerQueueThreaded () = 0; +}; + +class epicsShareClass epicsTimerQueueNonThreaded { +public: + static epicsTimerQueueNonThreaded & create (); + virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0; + virtual void process () = 0; + virtual double getNextExpireDelay () const = 0; + virtual void show ( unsigned int level ) const = 0; + virtual void release () = 0; +protected: + virtual ~epicsTimerQueueNonThreaded () = 0; +}; + +inline epicsTimerNotify::expireStatus::expireStatus ( restart_t restart ) : + again ( false ), delay ( - DBL_MAX ) +{ + assert ( restart == noRestart ); +} + +inline epicsTimerNotify::expireStatus::expireStatus + ( restart_t, const double &expireDelaySec ) : + again ( true ), delay ( expireDelaySec ) +{ + assert ( this->delay >= 0.0 ); +} + +inline bool epicsTimerNotify::expireStatus::restart () const +{ + return this->again; +} + +inline double epicsTimerNotify::expireStatus::expirationDelay () const +{ + assert ( this->again ); + return this->delay; +} + extern "C" { -#endif /*__cplusplus */ +#endif /* __cplusplus */ typedef void *epicsTimerQueueId; epicsShareFunc epicsTimerQueueId* epicsShareAPI - epicsTimerQueueCreateNonThreaded(); + epicsTimerQueueCreateNonThreaded (); epicsShareFunc epicsTimerQueueId* epicsShareAPI - epicsTimerQueueCreateThreaded(unsigned int threadPriority,int okToShare); -epicsShareFunc void epicsShareAPI epicsTimerQueueDelete(epicsTimerQueueId); + epicsTimerQueueCreateThreaded ( unsigned int threadPriority, int okToShare ); +epicsShareFunc void epicsShareAPI epicsTimerQueueDelete ( epicsTimerQueueId ); -epicsShareFunc void epicsShareAPI epicsTimerQueueProcess(epicsTimerQueueId); -epicsShareFunc int epicsShareAPI epicsTimerQueueGetExpireTime( - epicsTimerQueueId, epicsTimeStamp *time); -epicsShareFunc void epicsShareAPI epicsTimerQueueShow( - epicsTimerQueueId id, unsigned int level); +epicsShareFunc void epicsShareAPI epicsTimerQueueProcess ( epicsTimerQueueId ); +epicsShareFunc int epicsShareAPI epicsTimerQueueGetExpireTime ( + epicsTimerQueueId, epicsTimeStamp *time ); +epicsShareFunc void epicsShareAPI epicsTimerQueueShow ( + epicsTimerQueueId id, unsigned int level ); typedef void *epicsTimerId; -typedef void (*epicsTimerCallback)(void *); +typedef void ( *epicsTimerCallback ) ( void * ); -epicsShareFunc epicsTimerId epicsShareAPI epicsTimerCreate( - epicsTimerQueueId queueid,epicsTimerCallback callback, void *arg); -epicsShareFunc void epicsShareAPI epicsTimerDestroy(epicsTimerId id); +epicsShareFunc epicsTimerId epicsShareAPI epicsTimerCreate ( + epicsTimerQueueId queueid,epicsTimerCallback callback, void *arg ); +epicsShareFunc void epicsShareAPI epicsTimerDestroy ( epicsTimerId id ); -epicsShareFunc void epicsShareAPI epicsTimerStartTime( - epicsTimerId id,epicsTimeStamp *time); -epicsShareFunc void epicsShareAPI epicsTimerStartDelay( - epicsTimerId id,double delaySeconds); -epicsShareFunc void epicsShareAPI epicsTimerCancel(epicsTimerId id); -/* GetExpireTime returns (0,1) if time (is not, is) given a value*/ -epicsShareFunc int epicsShareAPI epicsTimerGetExpireTime( +epicsShareFunc void epicsShareAPI epicsTimerStartTime ( + epicsTimerId id,epicsTimeStamp *time ); +epicsShareFunc void epicsShareAPI epicsTimerStartDelay ( + epicsTimerId id,double delaySeconds ); +epicsShareFunc void epicsShareAPI epicsTimerCancel ( epicsTimerId id ); +/* GetExpireTime returns (0,1) if time (is not, is) given a value */ +epicsShareFunc int epicsShareAPI epicsTimerGetExpireTime ( epicsTimerId id, epicsTimeStamp *time); -/* epicsTimerIsExpired returns (0,1) if timer (is not, is) expired*/ -epicsShareFunc int epicsShareAPI epicsTimerIsExpired(epicsTimerId id); -epicsShareFunc void epicsShareAPI epicsTimerShow( - epicsTimerId id, unsigned int level); +epicsShareFunc void epicsShareAPI epicsTimerShow ( + epicsTimerId id, unsigned int level ); #ifdef __cplusplus } -#endif /*__cplusplus */ +#endif /* __cplusplus */ -#endif /*epicsTimerH*/ +#endif /* epicsTimerH */