diff --git a/testApp/remote/channelAccessIFTest.cpp b/testApp/remote/channelAccessIFTest.cpp index 740449e..7f90f0a 100755 --- a/testApp/remote/channelAccessIFTest.cpp +++ b/testApp/remote/channelAccessIFTest.cpp @@ -2119,6 +2119,12 @@ void ChannelAccessIFTest::test_stressPutAndGetLargeArray() { return; } + bool s = putReq->syncGet(getTimeoutSec()); + if (!s) { + testFail("%s: sync get failed", CURRENT_FUNCTION); + return; + } + PVDoubleArray::shared_pointer value = putReq->getPVStructure()->getSubField("value"); if (!value.get()) { testFail("%s: getting double array value field failed ", CURRENT_FUNCTION); @@ -2297,9 +2303,7 @@ void ChannelAccessIFTest::test_stressMonitorAndProcess() { return; } - while(monitorReq->getMonitorCounter() < i) { - monitorReq->waitUntilMonitor(getTimeoutSec()); - } + monitorReq->waitUntilMonitor(i, getTimeoutSec()); int counter = monitorReq->getMonitorCounter(); diff --git a/testApp/remote/syncTestRequesters.h b/testApp/remote/syncTestRequesters.h index 8a4ae56..68b1e6d 100755 --- a/testApp/remote/syncTestRequesters.h +++ b/testApp/remote/syncTestRequesters.h @@ -48,7 +48,7 @@ class SyncBaseRequester { SyncBaseRequester(bool debug = false): m_debug(debug), - m_event(new Event()), + m_event(), m_connectedStatus(false), m_getStatus(false), m_putStatus(false) {} @@ -126,25 +126,17 @@ class SyncBaseRequester { } void resetEvent() { - Lock lock(m_eventMutex); - m_event.reset(new Event()); + m_event.tryWait(); } void signalEvent() { - Lock lock(m_eventMutex); - m_event->signal(); + m_event.signal(); } bool waitUntilEvent(double timeOut) { - std::tr1::shared_ptr event; - { - Lock lock(m_eventMutex); - event = m_event; - } - - bool signaled = event->wait(timeOut); + bool signaled = m_event.wait(timeOut); if (!signaled) { if (m_debug) @@ -158,7 +150,7 @@ class SyncBaseRequester { private: - std::tr1::shared_ptr m_event; + epics::pvData::Event m_event; bool m_connectedStatus; bool m_getStatus; bool m_putStatus; @@ -167,7 +159,6 @@ class SyncBaseRequester { Mutex m_getStatusMutex; Mutex m_putStatusMutex; Mutex m_processStatusMutex; - Mutex m_eventMutex; }; @@ -1136,6 +1127,31 @@ class SyncMonitorRequesterImpl: public MonitorRequester, public SyncBaseRequeste return m_monitorStatus; } + bool waitUntilMonitor(int expectedCount, double timeOut) + { + + resetEvent(); + + { + Lock lock(m_pointerMutex); + m_monitorStatus = false; + if (m_monitorCounter >= expectedCount) + return true; + } + + + bool signaled = waitUntilEvent(timeOut); + if (!signaled) { + + if (m_debug) + std::cerr << getRequesterName() << ".waitUntilMonitor:" << " timeout occurred" << endl; + + return false; + } + + Lock lock(m_pointerMutex); + return m_monitorStatus; + } virtual string getRequesterName() {