added sleep quantum correction using epicsThreadSleepQuantum()
This commit is contained in:
@@ -79,10 +79,14 @@ void epicsTimerQueueActiveForC::release ()
|
||||
pMgr->release ( *this );
|
||||
}
|
||||
|
||||
epicsTimerQueuePassiveForC::epicsTimerQueuePassiveForC
|
||||
( epicsTimerQueueRescheduleCallback pCallbackIn, void * pPrivateIn ) :
|
||||
epicsTimerQueuePassiveForC::epicsTimerQueuePassiveForC (
|
||||
epicsTimerQueueNotifyReschedule pRescheduleCallbackIn,
|
||||
epicsTimerQueueNotifyQuantum pSleepQuantumCallbackIn,
|
||||
void * pPrivateIn ) :
|
||||
timerQueuePassive ( * static_cast < epicsTimerQueueNotify * > ( this ) ),
|
||||
pCallback ( pCallbackIn ), pPrivate ( pPrivateIn )
|
||||
pRescheduleCallback ( pRescheduleCallbackIn ),
|
||||
pSleepQuantumCallback ( pSleepQuantumCallbackIn ),
|
||||
pPrivate ( pPrivateIn )
|
||||
{
|
||||
}
|
||||
|
||||
@@ -92,7 +96,12 @@ epicsTimerQueuePassiveForC::~epicsTimerQueuePassiveForC ()
|
||||
|
||||
void epicsTimerQueuePassiveForC::reschedule ()
|
||||
{
|
||||
(*this->pCallback) ( this->pPrivate );
|
||||
(*this->pRescheduleCallback) ( this->pPrivate );
|
||||
}
|
||||
|
||||
double epicsTimerQueuePassiveForC::quantum ()
|
||||
{
|
||||
return (*this->pSleepQuantumCallback) ( this->pPrivate );
|
||||
}
|
||||
|
||||
void epicsTimerQueuePassiveForC::destroy ()
|
||||
@@ -138,10 +147,16 @@ epicsShareFunc double epicsTimerNotify::expireStatus::expirationDelay () const
|
||||
}
|
||||
|
||||
extern "C" epicsTimerQueuePassiveId epicsShareAPI
|
||||
epicsTimerQueuePassiveCreate ( epicsTimerQueueRescheduleCallback pCallbackIn, void *pPrivateIn )
|
||||
epicsTimerQueuePassiveCreate (
|
||||
epicsTimerQueueNotifyReschedule pRescheduleCallbackIn,
|
||||
epicsTimerQueueNotifyQuantum pSleepQuantumCallbackIn,
|
||||
void * pPrivateIn )
|
||||
{
|
||||
try {
|
||||
return new epicsTimerQueuePassiveForC ( pCallbackIn, pPrivateIn );
|
||||
return new epicsTimerQueuePassiveForC (
|
||||
pRescheduleCallbackIn,
|
||||
pSleepQuantumCallbackIn,
|
||||
pPrivateIn );
|
||||
}
|
||||
catch ( ... ) {
|
||||
return 0;
|
||||
|
||||
@@ -89,6 +89,9 @@ public:
|
||||
// called when a new timer is inserted into the queue and the
|
||||
// delay to the next expire has changed
|
||||
virtual void reschedule () = 0;
|
||||
// if there is a quantum in the scheduling of timer intervals
|
||||
// return this quantum in seconds. If unknown then return zero.
|
||||
virtual double quantum () = 0;
|
||||
protected:
|
||||
virtual ~epicsTimerQueueNotify () = 0;
|
||||
};
|
||||
@@ -142,9 +145,11 @@ epicsShareFunc void epicsShareAPI
|
||||
|
||||
/* passive timer queue */
|
||||
typedef struct epicsTimerQueuePassiveForC * epicsTimerQueuePassiveId;
|
||||
typedef void ( *epicsTimerQueueRescheduleCallback ) ( void *pPrivate );
|
||||
typedef void ( * epicsTimerQueueNotifyReschedule ) ( void * pPrivate );
|
||||
typedef double ( * epicsTimerQueueNotifyQuantum ) ( void * pPrivate );
|
||||
epicsShareFunc epicsTimerQueuePassiveId epicsShareAPI
|
||||
epicsTimerQueuePassiveCreate ( epicsTimerQueueRescheduleCallback, void *pPrivate );
|
||||
epicsTimerQueuePassiveCreate ( epicsTimerQueueNotifyReschedule,
|
||||
epicsTimerQueueNotifyQuantum, void *pPrivate );
|
||||
epicsShareFunc void epicsShareAPI
|
||||
epicsTimerQueuePassiveDestroy ( epicsTimerQueuePassiveId );
|
||||
epicsShareFunc epicsTimerId epicsShareAPI
|
||||
|
||||
@@ -66,7 +66,7 @@ void timer::start ( epicsTimerNotify & notify, const epicsTime & expire )
|
||||
void timer::privateStart ( epicsTimerNotify & notify, const epicsTime & expire )
|
||||
{
|
||||
this->pNotify = & notify;
|
||||
this->exp = expire;
|
||||
this->exp = expire - this->queue.sleepQuantumOverTwo;
|
||||
|
||||
bool reschedualNeeded = false;
|
||||
if ( this->curState == stateActive ) {
|
||||
|
||||
@@ -100,6 +100,7 @@ private:
|
||||
mutable epicsMutex mutex;
|
||||
epicsEvent cancelBlockingEvent;
|
||||
tsDLList < timer > timerList;
|
||||
const double sleepQuantumOverTwo;
|
||||
epicsTimerQueueNotify & notify;
|
||||
timer * pExpireTmr;
|
||||
epicsThreadId processThread;
|
||||
@@ -142,6 +143,7 @@ private:
|
||||
bool terminateFlag;
|
||||
void run ();
|
||||
void reschedule ();
|
||||
double quantum ();
|
||||
epicsTimerQueue & getEpicsTimerQueue ();
|
||||
timerQueueActive ( const timerQueueActive & );
|
||||
timerQueueActive & operator = ( const timerQueueActive & );
|
||||
@@ -178,17 +180,23 @@ protected:
|
||||
timerQueuePassive & operator = ( const timerQueuePassive & );
|
||||
};
|
||||
|
||||
struct epicsTimerQueuePassiveForC : public epicsTimerQueueNotify, public timerQueuePassive {
|
||||
struct epicsTimerQueuePassiveForC :
|
||||
public epicsTimerQueueNotify, public timerQueuePassive {
|
||||
public:
|
||||
epicsTimerQueuePassiveForC ( epicsTimerQueueRescheduleCallback pCallback, void *pPrivate );
|
||||
epicsTimerQueuePassiveForC (
|
||||
epicsTimerQueueNotifyReschedule,
|
||||
epicsTimerQueueNotifyQuantum,
|
||||
void * pPrivate );
|
||||
void destroy ();
|
||||
protected:
|
||||
~epicsTimerQueuePassiveForC ();
|
||||
private:
|
||||
epicsTimerQueueRescheduleCallback pCallback;
|
||||
void *pPrivate;
|
||||
epicsTimerQueueNotifyReschedule pRescheduleCallback;
|
||||
epicsTimerQueueNotifyQuantum pSleepQuantumCallback;
|
||||
void * pPrivate;
|
||||
static epicsSingleton < tsFreeList < epicsTimerQueuePassiveForC, 0x10 > > pFreeList;
|
||||
void reschedule ();
|
||||
double quantum ();
|
||||
};
|
||||
|
||||
struct epicsTimerQueueActiveForC : public timerQueueActive,
|
||||
|
||||
@@ -22,8 +22,9 @@
|
||||
epicsTimerQueue::~epicsTimerQueue () {}
|
||||
|
||||
timerQueue::timerQueue ( epicsTimerQueueNotify ¬ifyIn ) :
|
||||
sleepQuantumOverTwo ( notifyIn.quantum () / 2.0 ),
|
||||
notify ( notifyIn ), pExpireTmr ( 0 ),
|
||||
processThread ( 0 ), cancelPending ( false )
|
||||
processThread ( 0 ), cancelPending ( false )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -86,6 +86,11 @@ void timerQueueActive::reschedule ()
|
||||
this->rescheduleEvent.signal ();
|
||||
}
|
||||
|
||||
double timerQueueActive::quantum ()
|
||||
{
|
||||
return epicsThreadSleepQuantum ();
|
||||
}
|
||||
|
||||
void timerQueueActive::show ( unsigned int level ) const
|
||||
{
|
||||
printf ( "EPICS threaded timer queue at %p\n",
|
||||
|
||||
Reference in New Issue
Block a user