pvalink fix shutdown

This commit is contained in:
Michael Davidsaver
2016-03-30 11:17:20 +09:00
parent 16ab57e1f3
commit 68ffed54c5
2 changed files with 11 additions and 1 deletions

View File

@@ -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

View File

@@ -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 "<<selfraw->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";