diff --git a/pdbApp/qsrv.cpp b/pdbApp/qsrv.cpp index 053524d..17ce0c5 100644 --- a/pdbApp/qsrv.cpp +++ b/pdbApp/qsrv.cpp @@ -13,85 +13,10 @@ namespace pva = epics::pvAccess; -namespace { - -struct qsrv_t { - epicsMutex mutex; - - pva::ServerContext::shared_pointer server; - - pva::ChannelProviderFactory::shared_pointer provider; -} *qsrv; - -} // namespace - -void qsrvStart() -{ - try{ - if(!qsrv) { - qsrv = new qsrv_t; - } - epicsGuard G(qsrv->mutex); - if(qsrv->server) { - std::cout<<"QSRV already started\n"; - } else { - qsrv->provider.reset(new BaseChannelProviderFactory("QSRV")); - pva::registerChannelProviderFactory(qsrv->provider); - qsrv->server = pva::startPVAServer("QSRV", 0, true, false); - if(!qsrv->server.unique()) - printf("Warning: new QSRV server instance includes reference loop\n"); - } - }catch(std::exception& e){ - printf("Error: %s\n", e.what()); - } -} - -void qsrvStop() -{ - try{ - epicsGuard G(qsrv->mutex); - if(!qsrv->server) { - std::cout<<"QSRV not running\n"; - } else { - if(!qsrv->server.unique()) - printf("Warning: QSRV server leaks1\n"); - qsrv->server->destroy(); - if(!qsrv->server.unique()) - printf("Warning: QSRV server leaks2\n"); - qsrv->server.reset(); - pva::unregisterChannelProviderFactory(qsrv->provider); - if(!qsrv->provider.unique()) - printf("Warning: QSRV provider leaks\n"); - qsrv->provider.reset(); - } - }catch(std::exception& e){ - printf("Error: %s\n", e.what()); - } -} - -static -void QSRVExit(void *) -{ - qsrvStop(); - delete qsrv; - qsrv = NULL; -} - -static -void QSRVHooks(initHookState state) -{ - if(state!=initHookAfterCaServerInit) - return; - epicsAtExit(QSRVExit, NULL); - qsrvStart(); -} - static void QSRVRegistrar() { - initHookRegister(QSRVHooks); - iocshRegister<&qsrvStart>("qsrvStart"); - iocshRegister<&qsrvStop>("qsrvStop"); + pva::ChannelProviderRegistry::servers()->add("QSRV"); } epicsExportRegistrar(QSRVRegistrar); diff --git a/testApp/testpdb.cpp b/testApp/testpdb.cpp index a901da9..84616ed 100644 --- a/testApp/testpdb.cpp +++ b/testApp/testpdb.cpp @@ -1,6 +1,7 @@ #include +#include #include #include @@ -393,8 +394,6 @@ void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov) extern "C" void p2pTestIoc_registerRecordDeviceDriver(struct dbBase *); -extern void qsrvStop(); - MAIN(testpdb) { testPlan(140); @@ -426,7 +425,7 @@ MAIN(testpdb) testOk1(prov.unique()); prov.reset(); - qsrvStop(); + iocshCmd("stopPVAServer"); testDiag("check to see that all dbChannel are closed before IOC shuts down"); testEqual(epics::atomic::get(PDBProvider::ninstances), 0u); diff --git a/testApp/testpvif.cpp b/testApp/testpvif.cpp index 7477c66..2894d98 100644 --- a/testApp/testpvif.cpp +++ b/testApp/testpvif.cpp @@ -1,6 +1,7 @@ #include +#include #include #include #include @@ -15,8 +16,6 @@ namespace pvd = epics::pvData; extern "C" void p2pTestIoc_registerRecordDeviceDriver(struct dbBase *); -void qsrvStop(); - namespace { void testScalar() @@ -201,7 +200,7 @@ void testScalar() testEqual(prec_mbbi->val, 2); dbScanUnlock((dbCommon*)prec_mbbi); - qsrvStop(); + iocshCmd("stopPVAServer"); } } // namespace