From b2254b3b45d927396548574b05b6ae730f91788f Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 1 Apr 2014 09:39:31 +0200 Subject: [PATCH] testServer: propery monitor queue impl. --- testApp/remote/channelAccessIFTest.cpp | 2 + testApp/remote/testServer.cpp | 65 ++++++++++++++++++++------ 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/testApp/remote/channelAccessIFTest.cpp b/testApp/remote/channelAccessIFTest.cpp index 23382c2..b8fc61c 100755 --- a/testApp/remote/channelAccessIFTest.cpp +++ b/testApp/remote/channelAccessIFTest.cpp @@ -1667,6 +1667,7 @@ void ChannelAccessIFTest::test_channelMonitor(int queueSize) { std::tr1::shared_ptr previousValue = getPVDataCreate()->createPVField(valueField->getField()); std::ostringstream oss; +//oss << *monitorReq->getChangedBitSet() << std::endl; oss << *monitorReq->getPVStructure(); testDiag("%s:\n%s", CURRENT_FUNCTION, oss.str().c_str()); @@ -1707,6 +1708,7 @@ testDiag("%s:\n%s", CURRENT_FUNCTION, oss.str().c_str()); std::ostringstream oss; oss << "previous value : " << *previousValue << std::endl; oss << "current value : " << *valueField << std::endl; +//oss << "changed : " << *monitorReq->getChangedBitSet() << std::endl; oss << *monitorReq->getPVStructure(); testDiag("%s:\n%s", CURRENT_FUNCTION, oss.str().c_str()); diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index d8bda17..1f9fb87 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -1812,8 +1812,24 @@ public: } }; +#include +class TraceLog { + public: + + TraceLog(const std::string &method) : m_method(method) { + std::cout << "--> " << m_method << std::endl; + } + ~TraceLog() { + std::cout << "<-- " << m_method << std::endl; + } + + private: + std::string m_method; +} + +#define TRACE_METHOD() TraceLog trace(CURRENT_FUNCTION); @@ -1833,7 +1849,8 @@ private: BitSet::shared_pointer m_overrunBitSet; bool m_first; Mutex m_lock; - int m_count; + enum QueueState { MM_STATE_FULL, MM_STATE_TAKEN, MM_STATE_FREE }; + QueueState m_state ; AtomicBoolean m_active; @@ -1850,7 +1867,7 @@ protected: m_overrunBitSet(new BitSet(m_pvStructure->getNumberFields())), m_first(true), m_lock(), - m_count(0), + m_state(MM_STATE_FREE), m_thisPtr(new MonitorElement()) { PVACCESS_REFCOUNT_MONITOR_CONSTRUCT(mockMonitor); @@ -1892,8 +1909,14 @@ public: } } virtual Status start() - { - copy(); + { + //TRACE_METHOD(); + + { + Lock xx(m_lock); + m_state = MM_STATE_FULL; + copy(); + } // first monitor Monitor::shared_pointer thisPtr = shared_from_this(); @@ -1912,13 +1935,25 @@ public: virtual void structureChanged() { + //TRACE_METHOD(); + if (m_active.get()) { - copy(); - { - Lock xx(m_lock); - m_count = 0; + Lock xx(m_lock); + + if (m_state == MM_STATE_FULL || m_state == MM_STATE_TAKEN) // "queue" full + { + m_overrunBitSet->set(0); + copy(); + return; + } + else + { + m_overrunBitSet->clear(0); + m_state = MM_STATE_FULL; + copy(); + } } Monitor::shared_pointer thisPtr = shared_from_this(); @@ -1928,25 +1963,27 @@ public: virtual MonitorElement::shared_pointer poll() { + //TRACE_METHOD(); + Lock xx(m_lock); - if (m_count) + if (m_state != MM_STATE_FULL) { return m_nullMonitor; } else { - m_count++; + m_state = MM_STATE_TAKEN; return m_thisPtr; } } virtual void release(MonitorElement::shared_pointer const & /*monitorElement*/) { + //TRACE_METHOD(); + Lock xx(m_lock); - if (m_count) - { - m_count--; - } + if (m_state == MM_STATE_TAKEN) + m_state = MM_STATE_FREE; } virtual void destroy()