From b3c1fef110de6ed33ed7613fc72443531bfc4302 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 16 Sep 2014 18:55:27 -0400 Subject: [PATCH] cleanup callback and callback*Test --- src/ioc/db/callback.c | 17 +++++++++++++---- src/ioc/db/test/callbackParallelTest.c | 6 ++++++ src/ioc/db/test/callbackTest.c | 6 ++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/ioc/db/callback.c b/src/ioc/db/callback.c index eca624798..574e05dd8 100644 --- a/src/ioc/db/callback.c +++ b/src/ioc/db/callback.c @@ -169,6 +169,7 @@ static void callbackTask(void *arg) } shutdown: + mySet->threadsRunning--; taskwdRemove(0); epicsEventSignal(startStopEvent); } @@ -180,16 +181,24 @@ void callbackShutdown(void) if (cbCtl == ctlExit) return; cbCtl = ctlExit; + /* sequential shutdown of workers */ for (i = 0; i < NUM_CALLBACK_PRIORITIES; i++) { - while (callbackQueue[i].threadsRunning--) { - int ok = epicsRingPointerPush(callbackQueue[i].queue, &exitCallback); - epicsEventSignal(callbackQueue[i].semWakeUp); - if (ok) epicsEventWait(startStopEvent); + while (callbackQueue[i].threadsRunning) { + if(epicsRingPointerPush(callbackQueue[i].queue, &exitCallback)) { + epicsEventSignal(callbackQueue[i].semWakeUp); + epicsEventWait(startStopEvent); + } else { + epicsThreadSleep(0.05); + } } + assert(callbackQueue[i].threadsRunning==0); + epicsEventDestroy(callbackQueue[i].semWakeUp); + epicsRingPointerDelete(callbackQueue[i].queue); } epicsTimerQueueRelease(timerQueue); epicsEventDestroy(startStopEvent); startStopEvent = NULL; + memset(callbackQueue, 0, sizeof(callbackQueue)); } void callbackInit(void) diff --git a/src/ioc/db/test/callbackParallelTest.c b/src/ioc/db/test/callbackParallelTest.c index d07b28346..eeb6ddaee 100644 --- a/src/ioc/db/test/callbackParallelTest.c +++ b/src/ioc/db/test/callbackParallelTest.c @@ -180,5 +180,11 @@ MAIN(callbackParallelTest) printStats(timeError[1], "MID"); printStats(timeError[2], "HIGH"); + for (i = 0; i < NCALLBACKS ; i++) { + free(pcbt[i]); + } + + callbackShutdown(); + return testDone(); } diff --git a/src/ioc/db/test/callbackTest.c b/src/ioc/db/test/callbackTest.c index 75e65765d..c4c6b31d9 100644 --- a/src/ioc/db/test/callbackTest.c +++ b/src/ioc/db/test/callbackTest.c @@ -177,5 +177,11 @@ MAIN(callbackTest) printStats(timeError[1], "MID"); printStats(timeError[2], "HIGH"); + for (i = 0; i < NCALLBACKS ; i++) { + free(pcbt[i]); + } + + callbackShutdown(); + return testDone(); }