very tricky...

ChannelMonitorImpl is lobotomized with the smarts going
to MonitorStrategyQueue, both implementing Monitor.
While CMI proxies calls poll/release() to MQS,
it seems that MQS doesn't proxy destroy() to CMI.
So calling destroy() on MQS is a no-op...
This commit is contained in:
Michael Davidsaver
2015-12-08 14:45:27 -05:00
parent 225c7ccb47
commit 9fe595722c
2 changed files with 6 additions and 7 deletions

View File

@ -180,8 +180,8 @@ GWChannel::createMonitor(
// Create upstream monitor
// This would create a strong ref. loop between ent and ent->mon.
// Instead we get clever and pass a "fake" strong ref, which simply
// checks to see that it will out-live the object.
// Instead we get clever and pass a "fake" strong ref.
// and ensure that ~MonitorCacheEntry destroy()s the client Monitor
MonitorCacheEntry::shared_pointer fakereal(ent.get(), noclean());
ent->mon = entry->channel->createMonitor(fakereal, pvRequest);

View File

@ -80,10 +80,9 @@ MonitorCacheEntry::monitorEvent(pvd::MonitorPtr const & monitor)
* The original was a ChannelMonitorImpl, we now see a MonitorStrategyQueue
* owned by the original, which delegates deserialization and accumulation
* of deltas into complete events for us.
* However, we don't want to keep the MonitorStrategyQueue as it's
* destroy() method is a no-op!
*/
assert(monitor==mon || !lastval);
if(!lastval)
mon = monitor;
epicsUInt32 cntpoll = 0;
//TODO: dequeue and requeue strategy code goes here
@ -91,7 +90,7 @@ MonitorCacheEntry::monitorEvent(pvd::MonitorPtr const & monitor)
pvd::MonitorElementPtr update;
while((update=mon->poll()))
while((update=monitor->poll()))
{
cntpoll++;
lastval = update->pvStructurePtr;
@ -126,7 +125,7 @@ MonitorCacheEntry::monitorEvent(pvd::MonitorPtr const & monitor)
}
}
mon->release(update);
monitor->release(update);
}
}