MonitorElement const and state tracking

Mark MonitorElement member pointers as const
to prevent user code from accidentally mangling.

Add 'state' tracking to help debugging
This commit is contained in:
Michael Davidsaver
2017-06-27 15:42:27 +02:00
parent 63a7649693
commit a3185f11da
4 changed files with 26 additions and 33 deletions

View File

@@ -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<uint32>(pvStructure->getStructure()->getNumberFields()))),
overrunBitSet(new BitSet(static_cast<uint32>(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()

View File

@@ -36,17 +36,19 @@ typedef std::tr1::shared_ptr<Monitor> 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<epics::pvData::uint32>(pvStructurePtr->getNumberFields()))),
overrunBitSet(epics::pvData::BitSet::create(static_cast<epics::pvData::uint32>(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;
};
/**

View File

@@ -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<epics::pvData::uint32>(pvStructurePtr->getNumberFields())))
,overrunBitSet(epics::pvData::BitSet::create(static_cast<epics::pvData::uint32>(pvStructurePtr->getNumberFields())))
,state(Free)
{}
}} // namespace epics::pvAccess

View File

@@ -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<epics::pvData::boolean>();
// 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
{