From 998bf8ac673710fda0ca650e98dc2c0e670ead33 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 19 Apr 2016 10:07:58 -0400 Subject: [PATCH] PVAServerRegister:: allow providerList, do not use epicsAtExit --- src/ioc/PVAServerRegister.cpp | 128 ++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 59 deletions(-) diff --git a/src/ioc/PVAServerRegister.cpp b/src/ioc/PVAServerRegister.cpp index 61145f8..bb8c2f7 100644 --- a/src/ioc/PVAServerRegister.cpp +++ b/src/ioc/PVAServerRegister.cpp @@ -37,71 +37,81 @@ using std::endl; using namespace epics::pvData; using namespace epics::pvAccess; -class PVAServerCTX; -typedef std::tr1::shared_ptr PVAServerCTXPtr; +//class PVAServerCTX; +//typedef std::tr1::shared_ptr PVAServerCTXPtr; +// +//class PVAServerCTX : +// public std::tr1::enable_shared_from_this +//{ +//public: +// POINTER_DEFINITIONS(PVAServerCTX); +// static PVAServerCTXPtr getPVAServerCTX(); +// void start(std::string const & providerNames); +// void stop(); +// virtual ~PVAServerCTX() {} +//private: +// PVAServerCTX() {} +// shared_pointer getPtrSelf() +// { +// return shared_from_this(); +// } +// ServerContext::shared_pointer ctx; +//}; +// +//void PVAServerCTX::start(std::string const & providerNames) +//{ +// if(ctx.get()) { +// cout<< "PVAServer already started" << endl; +// return; +// } +// ctx = startPVAServer(providerNames,0,true,true); +//} +// +//void PVAServerCTX::stop() +//{ +// if(!ctx.get()) { +// cout<< "PVAServer already stopped" << endl; +// return; +// } +// ctx->destroy(); +// ctx.reset(); +//} +// +//PVAServerCTXPtr PVAServerCTX::getPVAServerCTX() +//{ +// static PVAServerCTXPtr pvPVAServerCTX; +// static Mutex mutex; +// Lock xx(mutex); +// +// if(!pvPVAServerCTX.get()) { +// pvPVAServerCTX = PVAServerCTXPtr(new PVAServerCTX()); +// } +// return pvPVAServerCTX; +//} -class PVAServerCTX : - public std::tr1::enable_shared_from_this -{ -public: - POINTER_DEFINITIONS(PVAServerCTX); - static PVAServerCTXPtr getPVAServerCTX(); - void start(); - void stop(); - virtual ~PVAServerCTX() {} -private: - PVAServerCTX() {} - shared_pointer getPtrSelf() - { - return shared_from_this(); - } - ServerContext::shared_pointer ctx; -}; +//static void pvaServerExitHandler(void* /*pPrivate*/) { +// PVAServerCTX::getPVAServerCTX()->stop(); +//} -void PVAServerCTX::start() -{ - if(ctx.get()) { - cout<< "PVAServer already started" << endl; - return; - } - ctx = startPVAServer(PVACCESS_ALL_PROVIDERS,0,true,true); -} - -void PVAServerCTX::stop() -{ - if(!ctx.get()) { - cout<< "PVAServer already stopped" << endl; - return; - } - ctx->destroy(); - ctx.reset(); - epicsThreadSleep(1.0); -} - -PVAServerCTXPtr PVAServerCTX::getPVAServerCTX() -{ - static PVAServerCTXPtr pvPVAServerCTX; - static Mutex mutex; - Lock xx(mutex); - - if(!pvPVAServerCTX.get()) { - pvPVAServerCTX = PVAServerCTXPtr(new PVAServerCTX()); - } - return pvPVAServerCTX; -} - -static void pvaServerExitHandler(void* /*pPrivate*/) { - cout << "pvaServerExitHandler\n"; - PVAServerCTX::getPVAServerCTX()->stop(); -} +static const iocshArg startPVAServerArg0 = { "providerNames", iocshArgString }; +static const iocshArg *startPVAServerArgs[] = { + &startPVAServerArg0}; static const iocshFuncDef startPVAServerFuncDef = { - "startPVAServer", 0, 0 + "startPVAServer", 1, startPVAServerArgs }; -extern "C" void startPVAServer(const iocshArgBuf *args) +static void startPVAServer(const iocshArgBuf *args) { - PVAServerCTX::getPVAServerCTX()->start(); - epicsAtExit(pvaServerExitHandler, NULL); + char *names = args[0].sval; + if(!names) { + startPVAServer(PVACCESS_ALL_PROVIDERS,0,true,true); +// PVAServerCTX::getPVAServerCTX()->start(PVACCESS_ALL_PROVIDERS); + } else { + std::string providerNames(names); + startPVAServer(providerNames,0,true,true); +// PVAServerCTX::getPVAServerCTX()->start(providerNames); + } +// epicsAtExit(pvaServerExitHandler, NULL); }