fix race condition between startMonitoring and beginGroupPut in pvCopyMonitor.cpp

This commit is contained in:
Marty Kraimer
2014-12-12 06:25:45 -05:00
parent 0e6639c149
commit 1a641f0d1b

View File

@ -134,18 +134,21 @@ void PVCopyMonitor::startMonitoring(MonitorElementPtr const & startElement)
}
if(isDestroyed) return;
monitorElement = startElement;
Lock xx(mutex);
if(isMonitoring) return;
isMonitoring = true;
isGroupPut = false;
std::list<PVCopyMonitorFieldNodePtr>::iterator iter;
for (iter = monitorFieldNodeList.begin();iter!=monitorFieldNodeList.end();++iter)
{
(*iter)->monitorPlugin->startMonitoring();
Lock xx(mutex);
if(isMonitoring) return;
isMonitoring = true;
isGroupPut = false;
std::list<PVCopyMonitorFieldNodePtr>::iterator iter;
for (iter = monitorFieldNodeList.begin();iter!=monitorFieldNodeList.end();++iter)
{
(*iter)->monitorPlugin->startMonitoring();
}
}
pvRecord->addListener(getPtrSelf());
pvRecord->lock();
try {
Lock xx(mutex);
pvCopy->traverseMaster(getPtrSelf());
monitorElement->changedBitSet->clear();
monitorElement->overrunBitSet->clear();