From 1e39224836ceed346404eb79d56f65e42aa2f1bc Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 18 Aug 2015 09:07:18 -0400 Subject: [PATCH] dbCa: simplify shutdown Don't need partial shutdown case anymore. Also avoid race when destorying startStopEvent --- src/ioc/db/dbCa.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/ioc/db/dbCa.c b/src/ioc/db/dbCa.c index bf06d995a..caf0addbb 100644 --- a/src/ioc/db/dbCa.c +++ b/src/ioc/db/dbCa.c @@ -64,7 +64,7 @@ static epicsEventId workListEvent; /*wakeup event for dbCaTask*/ static int removesOutstanding = 0; #define removesOutstandingWarning 10000 -static volatile enum { +static volatile enum dbCaCtl_t { ctlInit, ctlRun, ctlPause, ctlExit } dbCaCtl; static epicsEventId startStopEvent; @@ -203,24 +203,11 @@ void dbCaCallbackProcess(void *userPvt) void dbCaShutdown(void) { - if (dbCaCtl == ctlRun || dbCaCtl == ctlPause) { - dbCaCtl = ctlExit; - epicsEventSignal(workListEvent); - epicsEventMustWait(startStopEvent); - epicsEventDestroy(startStopEvent); - } else { - /* manually cleanup queue since dbCa thread isn't running - * which only happens in unit tests - */ - caLink *pca; - epicsMutexMustLock(workListLock); - while((pca=(caLink*)ellGet(&workList))!=NULL) { - if(pca->link_action&CA_CLEAR_CHANNEL) { - caLinkDec(pca); - } - } - epicsMutexUnlock(workListLock); - } + enum dbCaCtl_t cur = dbCaCtl; + assert(cur == ctlRun || cur == ctlPause); + dbCaCtl = ctlExit; + epicsEventSignal(workListEvent); + epicsEventMustWait(startStopEvent); } static void dbCaLinkInitImpl(int isolate) @@ -233,7 +220,8 @@ static void dbCaLinkInitImpl(int isolate) if (!workListEvent) workListEvent = epicsEventMustCreate(epicsEventEmpty); - startStopEvent = epicsEventMustCreate(epicsEventEmpty); + if(!startStopEvent) + startStopEvent = epicsEventMustCreate(epicsEventEmpty); dbCaCtl = ctlPause; epicsThreadCreate("dbCaLink", epicsThreadPriorityMedium,