From ff942a16441a0929be005a2c6d453303406a6368 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 31 Jul 2012 11:59:44 +0200 Subject: [PATCH] reuse (if possible) existing pvStructure and bitSet --- .../remoteClient/clientContextImpl.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index 0084cf4..2eacbba 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -307,6 +307,19 @@ namespace epics { BitSet::shared_pointer BaseRequestImpl::nullBitSet; + static BitSet::shared_pointer createBitSetFor(PVStructure::shared_pointer const & pvStructure, BitSet::shared_pointer const & existingBitSet) + { + int pvStructureSize = pvStructure->getNumberFields(); + if (existingBitSet.get() && static_cast(existingBitSet->size()) >= pvStructureSize) + { + // clear existing BitSet + // also necessary if larger BitSet is reused + existingBitSet->clear(); + return existingBitSet; + } + else + return BitSet::shared_pointer(new BitSet(pvStructureSize)); + } PVACCESS_REFCOUNT_MONITOR_DEFINE(channelProcess); @@ -548,8 +561,8 @@ namespace epics { // create data and its bitSet { Lock lock(m_structureMutex); - m_structure = SerializationHelper::deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); - m_bitSet.reset(new BitSet(m_structure->getNumberFields())); + m_structure = SerializationHelper::deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get(), m_structure); + m_bitSet = createBitSetFor(m_structure, m_bitSet); } // notify @@ -755,8 +768,8 @@ namespace epics { // create data and its bitSet { Lock lock(m_structureMutex); - m_structure = SerializationHelper::deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); - m_bitSet.reset(new BitSet(m_structure->getNumberFields())); + m_structure = SerializationHelper::deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get(), m_structure); + m_bitSet = createBitSetFor(m_structure, m_bitSet); } // notify