PVAServerRegister:: allow providerList, do not use epicsAtExit
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user