From b03e2f376bf8bd126dacc684b34afc35c309fd92 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 13 May 2020 16:11:31 -0500 Subject: [PATCH] eMQTest: Start each test with a new (empty) queue If fastReceiver() took more than 0.01 seconds to exit, sleepySender() might have pushed a second message onto the queue after setting recvExit, so there would be an extra message in the queue for the next test, which I was seeing on Appveyor. That's my current theory... --- src/libCom/test/epicsMessageQueueTest.cpp | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/libCom/test/epicsMessageQueueTest.cpp b/src/libCom/test/epicsMessageQueueTest.cpp index b793ce2cd..f23683c84 100644 --- a/src/libCom/test/epicsMessageQueueTest.cpp +++ b/src/libCom/test/epicsMessageQueueTest.cpp @@ -136,16 +136,16 @@ fastReceiver(void *arg) epicsEventSignal(complete); } -void sleepySender(epicsMessageQueue *q, double delay) +void sleepySender(double delay) { testDiag("sleepySender: sending every %.3f seconds", delay); + epicsMessageQueue q(4, 20); epicsThreadCreate("Fast Receiver", epicsThreadPriorityMedium, - mediumStack, fastReceiver, q); + mediumStack, fastReceiver, &q); numSent = 0; - numReceived = 0; for (int i = 0 ; i < SLEEPY_TESTS ; i++) { - if (q->send((void *)msg1, 4) == 0) { + if (q.send((void *)msg1, 4) == 0) { numSent++; } epicsThreadSleep(delay); @@ -157,7 +157,7 @@ void sleepySender(epicsMessageQueue *q, double delay) numReceived, SLEEPY_TESTS); recvExit = 1; - while (q->send((void *)msg1, 4) != 0) + while (q.send((void *)msg1, 4) != 0) epicsThreadSleep(0.01); epicsEventMustWait(complete); } @@ -182,17 +182,18 @@ fastSender(void *arg) epicsEventSignal(complete); } -void sleepyReceiver(epicsMessageQueue *q, double delay) +void sleepyReceiver(double delay) { testDiag("sleepyReceiver: acquiring every %.3f seconds", delay); + epicsMessageQueue q(4, 20); // Fill the queue - for (int i = q->pending(); i < 4 ;i++) { - q->send((void *)msg1, 4); + for (int i = q.pending(); i < 4 ;i++) { + q.send((void *)msg1, 4); } epicsThreadCreate("Fast Sender", epicsThreadPriorityMedium, - mediumStack, fastSender, q); + mediumStack, fastSender, &q); epicsThreadSleep(0.5); char cbuf[80]; @@ -200,7 +201,7 @@ void sleepyReceiver(epicsMessageQueue *q, double delay) numReceived = 0; for (int i = 0 ; i < SLEEPY_TESTS ; i++) { - len = q->receive(cbuf, sizeof cbuf); + len = q.receive(cbuf, sizeof cbuf); if (len > 0) { numReceived++; } @@ -213,7 +214,7 @@ void sleepyReceiver(epicsMessageQueue *q, double delay) numReceived, SLEEPY_TESTS); sendExit = 1; - while (q->receive(cbuf, sizeof cbuf) <= 0) + while (q.receive(cbuf, sizeof cbuf) <= 0) epicsThreadSleep(0.01); epicsEventMustWait(complete); } @@ -245,7 +246,6 @@ extern "C" void messageQueueTest(void *parm) int want; epicsMessageQueue *q1 = new epicsMessageQueue(4, 20); - epicsMessageQueue *q2 = new epicsMessageQueue(4, 20); testDiag("Simple single-thread tests:"); i = 0; @@ -360,12 +360,12 @@ extern "C" void messageQueueTest(void *parm) SLEEPY_TESTS * 0.010); complete = epicsEventMustCreate(epicsEventEmpty); - sleepySender(q2, 0.009); - sleepySender(q2, 0.010); - sleepySender(q2, 0.011); - sleepyReceiver(q2, 0.009); - sleepyReceiver(q2, 0.010); - sleepyReceiver(q2, 0.011); + sleepySender(0.009); + sleepySender(0.010); + sleepySender(0.011); + sleepyReceiver(0.009); + sleepyReceiver(0.010); + sleepyReceiver(0.011); testDiag("Single receiver, single sender tests:"); epicsThreadSetPriority(myThreadId, epicsThreadPriorityHigh);