added sleep quantum correction using epicsThreadSleepQuantum()

This commit is contained in:
Jeff Hill
2003-03-21 19:26:00 +00:00
parent 4c142e759c
commit 0792aebf95
10 changed files with 114 additions and 27 deletions
+21 -6
View File
@@ -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;
+7 -2
View File
@@ -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
+1 -1
View File
@@ -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 ) {
+12 -4
View File
@@ -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,
+2 -1
View File
@@ -22,8 +22,9 @@
epicsTimerQueue::~epicsTimerQueue () {}
timerQueue::timerQueue ( epicsTimerQueueNotify &notifyIn ) :
sleepQuantumOverTwo ( notifyIn.quantum () / 2.0 ),
notify ( notifyIn ), pExpireTmr ( 0 ),
processThread ( 0 ), cancelPending ( false )
processThread ( 0 ), cancelPending ( false )
{
}
+5
View File
@@ -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",