incorrect ref counting for timer queues
Bug #786979 reported by
mdavidsaver
This bug affects 1 person
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
EPICS Base |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
Shared timer queues are unconditionally deleted by the first call to timerQueueActiv
Test will crash on "T1->destroy();" because the queue is free'd by "Q2->release();".
Related branches
Changed in epics-base: | |
status: | New → Fix Committed |
Changed in epics-base: | |
status: | Fix Committed → Fix Released |
To post a comment you must log in.
It appears that this bug was introduced by the fix for mantis 332 on 2009-2-10
Perhaps we need a fix like this:
before:
void timerQueueActiveMgr :: ActiveForC & queue ) ctiveMgrPrivate * pPriv = & queue; eActiveMgrPriva te::referenceCo unt > 0u );
queue. timerQueueActiv eMgrPrivate: :referenceCount --; eActiveMgrPriva te::referenceCo unt == 0u ) {
this- >sharedQueueLis t.remove ( queue );
release ( epicsTimerQueue
{
timerQueueA
{
Guard locker ( this->mutex );
assert ( queue.timerQueu
if ( queue.timerQueu
if ( queue.sharingOK () ) {
}
}
}
// 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;
}
after:
void timerQueueActiveMgr :: ActiveForC & queue ) ctiveMgrPrivate * pPriv = & queue; eActiveMgrPriva te::referenceCo unt > 0u );
queue. timerQueueActiv eMgrPrivate: :referenceCount --; eActiveMgrPriva te::referenceCo unt > 0u ) {
this- >sharedQueueLis t.remove ( queue );
release ( epicsTimerQueue
{
timerQueueA
{
Guard locker ( this->mutex );
assert ( queue.timerQueu
if ( queue.timerQueu
pPriv = 0;
}
else if ( queue.sharingOK () ) {
}
}
// 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
idelete pPriv;
}