PVAServerRegister:: allow providerList, do not use epicsAtExit

This commit is contained in:
mrkraimer
2016-04-19 10:07:58 -04:00
parent 0f61408a28
commit 998bf8ac67

View File

@@ -37,71 +37,81 @@ using std::endl;
using namespace epics::pvData;
using namespace epics::pvAccess;
class PVAServerCTX;
typedef std::tr1::shared_ptr<PVAServerCTX> PVAServerCTXPtr;
//class PVAServerCTX;
//typedef std::tr1::shared_ptr<PVAServerCTX> PVAServerCTXPtr;
//
//class PVAServerCTX :
// public std::tr1::enable_shared_from_this<PVAServerCTX>
//{
//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<PVAServerCTX>
{
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);
}