Merge pull request #46 from mrkraimer/master
PVAServerRegister:: allow providerList, do not use epicsAtExit
This commit is contained in:
@@ -32,10 +32,6 @@ using std::endl;
|
||||
using namespace epics::pvData;
|
||||
using namespace epics::pvAccess;
|
||||
|
||||
//static void pvaClientExitHandler(void* /*pPrivate*/) {
|
||||
//cout << "pvaClientExitHandler\n";
|
||||
// ClientFactory::stop();
|
||||
//}
|
||||
|
||||
static const iocshFuncDef startPVAClientFuncDef = {
|
||||
"startPVAClient", 0, 0
|
||||
@@ -44,7 +40,6 @@ static const iocshFuncDef startPVAClientFuncDef = {
|
||||
extern "C" void startPVAClient(const iocshArgBuf *args)
|
||||
{
|
||||
ClientFactory::start();
|
||||
// epicsAtExit(pvaClientExitHandler, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -37,71 +37,22 @@ using std::endl;
|
||||
using namespace epics::pvData;
|
||||
using namespace epics::pvAccess;
|
||||
|
||||
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();
|
||||
void stop();
|
||||
virtual ~PVAServerCTX() {}
|
||||
private:
|
||||
PVAServerCTX() {}
|
||||
shared_pointer getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
ServerContext::shared_pointer ctx;
|
||||
};
|
||||
|
||||
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);
|
||||
} else {
|
||||
std::string providerNames(names);
|
||||
startPVAServer(providerNames,0,true,true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user