diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index 66535f3..33ed880 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -1427,17 +1427,11 @@ CAChannelMonitor::CAChannelMonitor(CAChannel::shared_pointer const & _channel, monitorRequester(_monitorRequester), getType(getDBRType(pvRequest, _channel->getNativeType())), pvStructure(createPVStructure(_channel, getType, pvRequest)), - changedBitSet(new BitSet(static_cast(pvStructure->getStructure()->getNumberFields()))), - overrunBitSet(new BitSet(static_cast(pvStructure->getStructure()->getNumberFields()))), count(0), - element(new MonitorElement()) + element(new MonitorElement(pvStructure)) { // TODO - changedBitSet->set(0); - - element->pvStructurePtr = pvStructure; - element->changedBitSet = changedBitSet; - element->overrunBitSet = overrunBitSet; + element->changedBitSet->set(0); } void CAChannelMonitor::activate() diff --git a/src/client/pv/monitor.h b/src/client/pv/monitor.h index 1cbf509..b08b0e4 100644 --- a/src/client/pv/monitor.h +++ b/src/client/pv/monitor.h @@ -36,17 +36,19 @@ typedef std::tr1::shared_ptr MonitorPtr; * @author mrk */ class epicsShareClass MonitorElement { - public: +public: POINTER_DEFINITIONS(MonitorElement); MonitorElement(){} - MonitorElement(epics::pvData::PVStructurePtr const & pvStructurePtr) - : pvStructurePtr(pvStructurePtr), - changedBitSet(epics::pvData::BitSet::create(static_cast(pvStructurePtr->getNumberFields()))), - overrunBitSet(epics::pvData::BitSet::create(static_cast(pvStructurePtr->getNumberFields()))) - {} - epics::pvData::PVStructurePtr pvStructurePtr; - epics::pvData::BitSet::shared_pointer changedBitSet; - epics::pvData::BitSet::shared_pointer overrunBitSet; + MonitorElement(epics::pvData::PVStructurePtr const & pvStructurePtr); + const epics::pvData::PVStructurePtr pvStructurePtr; + const epics::pvData::BitSet::shared_pointer changedBitSet; + const epics::pvData::BitSet::shared_pointer overrunBitSet; + // info to assist monitor debugging + enum state_t { + Free, //!< data invalid. eg. on internal free list + Queued, //!< data valid. Owned by Monitor. Waiting for Monitor::poll() + InUse //!< data valid. Owned by MonitorRequester. Waiting for Monitor::release() + } state; }; /** diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index c24e533..e49bf05 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -124,5 +124,11 @@ ChannelRequester::shared_pointer DefaultChannelRequester::build() } -} -} +MonitorElement::MonitorElement(epics::pvData::PVStructurePtr const & pvStructurePtr) + : pvStructurePtr(pvStructurePtr) + ,changedBitSet(epics::pvData::BitSet::create(static_cast(pvStructurePtr->getNumberFields()))) + ,overrunBitSet(epics::pvData::BitSet::create(static_cast(pvStructurePtr->getNumberFields()))) + ,state(Free) +{} + +}} // namespace epics::pvAccess diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index ab46846..e663ce8 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -1926,8 +1926,6 @@ private: bool m_continuous; PVStructure::shared_pointer m_pvStructure; PVStructure::shared_pointer m_ccopy; - BitSet::shared_pointer m_changedBitSet; - BitSet::shared_pointer m_overrunBitSet; Mutex m_lock; enum QueueState { MM_STATE_FULL, MM_STATE_TAKEN, MM_STATE_FREE }; QueueState m_state ; @@ -1935,7 +1933,6 @@ private: MonitorElement::shared_pointer m_thisPtr; - MonitorElement::shared_pointer m_nullMonitor; protected: MockMonitor(std::string const & channelName, MonitorRequester::shared_pointer const & monitorRequester, @@ -1945,11 +1942,9 @@ protected: m_continuous(false), m_pvStructure(getRequestedStructure(pvStructure, pvRequest)), m_ccopy(getPVDataCreate()->createPVStructure(m_pvStructure->getStructure())), - m_changedBitSet(new BitSet(m_pvStructure->getNumberFields())), - m_overrunBitSet(new BitSet(m_pvStructure->getNumberFields())), m_lock(), m_state(MM_STATE_FREE), - m_thisPtr(new MonitorElement()) + m_thisPtr(new MonitorElement(m_ccopy)) { PVACCESS_REFCOUNT_MONITOR_CONSTRUCT(mockMonitor); @@ -1958,11 +1953,7 @@ protected: m_continuous = pvScalar->getAs(); // we always send all - m_changedBitSet->set(0); - - m_thisPtr->pvStructurePtr = m_ccopy; - m_thisPtr->changedBitSet = m_changedBitSet; - m_thisPtr->overrunBitSet = m_overrunBitSet; + m_thisPtr->changedBitSet->set(0); } public: @@ -2034,13 +2025,13 @@ public: if (m_state == MM_STATE_FULL || m_state == MM_STATE_TAKEN) // "queue" full { - m_overrunBitSet->set(0); + m_thisPtr->overrunBitSet->set(0); copy(); return; } else { - m_overrunBitSet->clear(0); + m_thisPtr->overrunBitSet->clear(0); m_state = MM_STATE_FULL; copy(); } @@ -2058,7 +2049,7 @@ public: Lock xx(m_lock); if (m_state != MM_STATE_FULL) { - return m_nullMonitor; + return MonitorElement::shared_pointer(); } else {