Merge pull request #46 from mrkraimer/master

PVAServerRegister:: allow providerList, do not use epicsAtExit
This commit is contained in:
Matej Sekoranja
2016-04-20 12:11:27 +02:00
2 changed files with 12 additions and 66 deletions

View File

@@ -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);
}

View File

@@ -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);
}
}