From 6ace47a55a611f24e5e8b7ae0a6e060112b3f544 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 8 Aug 2017 16:52:11 +0200 Subject: [PATCH 1/2] adapt to PVStructure const propagation --- pvtoolsSrc/pvutils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvtoolsSrc/pvutils.cpp b/pvtoolsSrc/pvutils.cpp index a727169..cdf8283 100644 --- a/pvtoolsSrc/pvutils.cpp +++ b/pvtoolsSrc/pvutils.cpp @@ -105,11 +105,11 @@ std::ostream& terse(std::ostream& o, PVField::shared_pointer const & pv) std::ostream& printEnumT(std::ostream& o, epics::pvData::PVStructure const & pvEnumT) { - PVInt::shared_pointer pvIndex = pvEnumT.getSubField("index"); + PVInt::const_shared_pointer pvIndex = pvEnumT.getSubField("index"); if (!pvIndex) throw std::runtime_error("enum_t structure does not have 'int index' field"); - PVStringArray::shared_pointer pvChoices = pvEnumT.getSubField("choices"); + PVStringArray::const_shared_pointer pvChoices = pvEnumT.getSubField("choices"); if (!pvChoices) throw std::runtime_error("enum_t structure does not have 'string choices[]' field"); From 561ea531988ea9982e39e4fe107ab3df8dcacaae Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 16 Aug 2017 10:30:15 +0200 Subject: [PATCH 2/2] Revert "avoid unnecessary temp. vector" This reverts commit 623596f327f9e7ace9ce52fa05c10bbb19d69643. Turns out it is necessary as reportStatus() can modify m_responseRequests --- src/remoteClient/clientContextImpl.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index 8495832..ad733e1 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -3912,15 +3912,25 @@ public: m_needSubscriptionUpdate = true; + // make a copy so that ResponseRequest::reportStatus() can + // remove itself from m_responseRequests + size_t count = 0; + std::vector rrs(m_responseRequests.size()); for (IOIDResponseRequestMap::iterator iter = m_responseRequests.begin(); iter != m_responseRequests.end(); iter++) { - ResponseRequest::shared_pointer ptr(iter->second.lock()); - if(ptr) - EXCEPTION_GUARD(ptr->reportStatus(state)); + rrs[count++] = iter->second; } + ResponseRequest::shared_pointer ptr; + for (size_t i = 0; i< count; i++) + { + if((ptr = rrs[i].lock())) + { + EXCEPTION_GUARD(ptr->reportStatus(state)); + } + } } /**