fixed mantis 332

This commit is contained in:
Jeff Hill
2009-02-10 22:24:20 +00:00
parent 6e913fe0bb
commit 62618480fd
4 changed files with 38 additions and 27 deletions

View File

@@ -30,8 +30,8 @@ timerQueueActiveMgr::~timerQueueActiveMgr ()
epicsGuard < epicsMutex > locker ( this->mutex );
}
epicsTimerQueueActiveForC & timerQueueActiveMgr::allocate (
bool okToShare, unsigned threadPriority )
epicsTimerQueueActiveForC & timerQueueActiveMgr ::
allocate ( RefThis & refThis, bool okToShare, unsigned threadPriority )
{
epicsGuard < epicsMutex > locker ( this->mutex );
if ( okToShare ) {
@@ -47,7 +47,7 @@ epicsTimerQueueActiveForC & timerQueueActiveMgr::allocate (
}
epicsTimerQueueActiveForC & queue =
* new epicsTimerQueueActiveForC ( okToShare, threadPriority );
* new epicsTimerQueueActiveForC ( refThis, okToShare, threadPriority );
queue.timerQueueActiveMgrPrivate::referenceCount = 1u;
if ( okToShare ) {
this->sharedQueueList.add ( queue );
@@ -55,18 +55,24 @@ epicsTimerQueueActiveForC & timerQueueActiveMgr::allocate (
return queue;
}
void timerQueueActiveMgr::release ( epicsTimerQueueActiveForC &queue )
void timerQueueActiveMgr ::
release ( epicsTimerQueueActiveForC & queue )
{
epicsGuard < epicsMutex > locker ( this->mutex );
assert ( queue.timerQueueActiveMgrPrivate::referenceCount > 0u );
queue.timerQueueActiveMgrPrivate::referenceCount--;
if ( queue.timerQueueActiveMgrPrivate::referenceCount == 0u ) {
if ( queue.sharingOK () ) {
this->sharedQueueList.remove ( queue );
timerQueueActiveMgrPrivate * pPriv = & queue;
{
epicsGuard < epicsMutex > locker ( this->mutex );
assert ( queue.timerQueueActiveMgrPrivate::referenceCount > 0u );
queue.timerQueueActiveMgrPrivate::referenceCount--;
if ( queue.timerQueueActiveMgrPrivate::referenceCount == 0u ) {
if ( queue.sharingOK () ) {
this->sharedQueueList.remove ( queue );
}
}
timerQueueActiveMgrPrivate *pPriv = &queue;
delete pPriv;
}
// delete only after we release the guard in case the embedded
// reference is the last one and this object is destroyed
// as a side effect
delete pPriv;
}
timerQueueActiveMgrPrivate::timerQueueActiveMgrPrivate () :