From 68ffed54c548b45dc2639250cee012da0eda1b2a Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 30 Mar 2016 11:17:20 +0900 Subject: [PATCH] pvalink fix shutdown --- pdbApp/Makefile | 1 + pdbApp/pvalink.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pdbApp/Makefile b/pdbApp/Makefile index 1f86adb..71bb5ea 100644 --- a/pdbApp/Makefile +++ b/pdbApp/Makefile @@ -31,6 +31,7 @@ softIocPVA_LIBS += pdbcore pvAccess pvData $(MBLIB) softIocPVA_LIBS += $(EPICS_BASE_IOC_LIBS) DBD += softIocPVA.dbd +DBD += qsrv.dbd softIocPVA_DBD += softIoc.dbd softIocPVA_DBD += qsrv.dbd diff --git a/pdbApp/pvalink.cpp b/pdbApp/pvalink.cpp index f3d29b3..71ddf20 100644 --- a/pdbApp/pvalink.cpp +++ b/pdbApp/pvalink.cpp @@ -447,7 +447,8 @@ void pvaLinkChannel::triggerProc(bool atomic) } } if(doscan && !scanself) { // need to scan, and not already queued, then queue - if(epicsJobQueue(scanjob)) { + int ret = epicsJobQueue(scanjob); + if(ret && ret!=S_pool_paused) { errlogPrintf("pvaLink: failed to queue scan from %s\n", name.c_str()); } else { scanself = shared_from_this(); @@ -460,6 +461,7 @@ void pvaLinkChannel::triggerProc(bool atomic) void pvaLinkChannel::scan(void* arg, epicsJobMode mode) { pvaLinkChannel *selfraw = (pvaLinkChannel*)arg; + if(mode!=epicsJobModeRun) return; // we will cleanup later pvaGlobal_t::Scan myscan; try { if(pvaLinkDebug>3) std::cerr<<"pvaLink scan "<name<<"\n"; @@ -469,6 +471,7 @@ void pvaLinkChannel::scan(void* arg, epicsJobMode mode) Guard G(selfraw->lock); selfraw->scanself.swap(self); // we take over ref, to keep channel alive, and allow re-queue + assert(self.get()==selfraw); // if scanself wasn't set, then the channel may be free'd if(mode==epicsJobModeCleanup) return; @@ -859,6 +862,12 @@ void initPVALink(initHookState state) errlogPrintf("Error initializing pva link handling : %s\n", e.what()); } + } else if(state==initHookAtIocShutdown) { + + // stop CP scans before closing links + epicsThreadPoolDestroy(pvaGlobal->scanpool); + pvaGlobal->scanpool = NULL; + } else if(state==initHookAfterCaLinkClose) { try { std::cout<<"cleanupPVALink\n";