Files
pcas/src/libCom/timer/epicsTimer.h
2001-02-21 18:25:54 +00:00

157 lines
5.3 KiB
C++

/* epicsTimer.h */
/* Authors: Marty Kraimer, Jeff Hill */
/********************COPYRIGHT NOTIFICATION**********************************
This software was developed under a United States Government license
described on the COPYRIGHT_Combined file included as part
of this distribution.
****************************************************************************/
#ifndef epicsTimerH
#define epicsTimerH
#include <float.h>
#include "shareLib.h"
#include "epicsAssert.h"
#include "epicsTime.h"
#include "epicsThread.h"
#ifdef __cplusplus
// code using a timer must implement epicsTimerNotify
class epicsShareClass epicsTimerNotify {
public:
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;
};
struct epicsShareClass epicsTimer {
public:
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;
};
struct epicsShareClass epicsTimerQueueThreaded {
public:
static epicsTimerQueueThreaded & allocate (
bool okToShare, int threadPriority = epicsThreadPriorityMin + 10 );
virtual void release () = 0;
virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0;
virtual void show ( unsigned int level ) const = 0;
protected:
virtual ~epicsTimerQueueThreaded () = 0;
};
class epicsTimerQueueNotify {
public:
// called when a new timer is inserted into the queue and the
// delay to the next expire has changed
virtual void reschedule () = 0;
};
struct epicsShareClass epicsTimerQueueNonThreaded {
public:
static epicsTimerQueueNonThreaded & create ( epicsTimerQueueNotify & );
virtual ~epicsTimerQueueNonThreaded () = 0;
virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0;
virtual void process () = 0;
virtual double getNextExpireDelay () const = 0;
virtual void show ( unsigned int level ) const = 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 */
/* threaded timer queue management */
typedef struct epicsTimerQueueThreaded * epicsTimerQueueThreadedId;
epicsShareFunc epicsTimerQueueThreadedId epicsShareAPI
epicsTimerQueueThreadedAllocate ( int okToShare, unsigned int threadPriority );
epicsShareFunc void epicsShareAPI
epicsTimerQueueThreadedRelease ( epicsTimerQueueThreadedId );
epicsShareFunc void epicsShareAPI
epicsTimerQueueThreadedShow ( epicsTimerQueueThreadedId id, unsigned int level );
/* non-threaded timer queue management */
typedef struct epicsTimerQueueNonThreaded * epicsTimerQueueNonThreadedId;
typedef void ( *epicsTimerQueueReschedualCallback ) ( void *pPrivate );
epicsShareFunc epicsTimerQueueNonThreadedId epicsShareAPI
epicsTimerQueueNonThreadedCreate ( epicsTimerQueueReschedualCallback, void *pPrivate );
epicsShareFunc void epicsShareAPI
epicsTimerQueueNonThreadedDestroy ( epicsTimerQueueNonThreadedId );
epicsShareFunc void epicsShareAPI
epicsTimerQueueNonThreadedProcess ( epicsTimerQueueNonThreadedId );
epicsShareFunc double epicsShareAPI
epicsTimerQueueNonThreadedGetDelayToNextExpire (
epicsTimerQueueNonThreadedId );
epicsShareFunc void epicsShareAPI epicsTimerQueueNonThreadedShow (
epicsTimerQueueNonThreadedId id, unsigned int level );
/* timer management */
typedef struct epicsTimer * epicsTimerId;
typedef void ( *epicsTimerCallback ) ( void *pPrivate );
epicsShareFunc epicsTimerId epicsShareAPI
epicsTimerQueueThreadedCreateTimer ( epicsTimerQueueThreadedId queueid,
epicsTimerCallback callback, void *arg );
epicsShareFunc epicsTimerId epicsShareAPI epicsTimerQueueNonThreadedCreateTimer (
epicsTimerQueueNonThreadedId queueid, epicsTimerCallback pCallback, void *pArg );
epicsShareFunc void epicsShareAPI
epicsTimerDestroy ( epicsTimerId id );
epicsShareFunc void epicsShareAPI
epicsTimerStartTime ( epicsTimerId id, const epicsTimeStamp *pTime );
epicsShareFunc void epicsShareAPI
epicsTimerStartDelay ( epicsTimerId id, double delaySeconds );
epicsShareFunc void epicsShareAPI
epicsTimerCancel ( epicsTimerId id );
epicsShareFunc double epicsShareAPI
epicsTimerGetExpireDelay ( epicsTimerId id );
epicsShareFunc void epicsShareAPI
epicsTimerShow ( epicsTimerId id, unsigned int level );
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* epicsTimerH */