still working on RAII
This commit is contained in:
@@ -223,15 +223,17 @@ class PvaClientGetCache;
|
||||
typedef std::tr1::shared_ptr<PvaClientGetCache> PvaClientGetCachePtr;
|
||||
class PvaClientPutCache;
|
||||
typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
|
||||
class ChannelRequesterImpl;
|
||||
typedef std::tr1::shared_ptr<ChannelRequesterImpl> ChannelRequesterImplPtr;
|
||||
|
||||
/**
|
||||
* @brief An easy to use alternative to directly calling the Channel methods of pvAccess.
|
||||
*
|
||||
* @author mrk
|
||||
*/
|
||||
class epicsShareClass PvaClientChannel :
|
||||
public epics::pvAccess::ChannelRequester,
|
||||
public std::tr1::enable_shared_from_this<PvaClientChannel>
|
||||
class epicsShareClass PvaClientChannel //:
|
||||
// public epics::pvAccess::ChannelRequester,
|
||||
// public std::tr1::enable_shared_from_this<PvaClientChannel>
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientChannel);
|
||||
@@ -451,10 +453,6 @@ public:
|
||||
/** Get the number of cached gets and puts.
|
||||
*/
|
||||
size_t cacheSize();
|
||||
PvaClientChannelPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
/** Deprecated method
|
||||
* \deprecated This method will go away in future versions.
|
||||
*/
|
||||
@@ -485,6 +483,7 @@ private:
|
||||
epics::pvData::Mutex mutex;
|
||||
epics::pvData::Event waitForConnect;
|
||||
epics::pvAccess::Channel::shared_pointer channel;
|
||||
ChannelRequesterImplPtr channelRequester;
|
||||
friend class PvaClient;
|
||||
};
|
||||
|
||||
@@ -971,9 +970,11 @@ private:
|
||||
*
|
||||
* @author mrk
|
||||
*/
|
||||
class epicsShareClass PvaClientGet :
|
||||
public epics::pvAccess::ChannelGetRequester,
|
||||
public std::tr1::enable_shared_from_this<PvaClientGet>
|
||||
class ChannelGetRequesterImpl;
|
||||
typedef std::tr1::shared_ptr<ChannelGetRequesterImpl> ChannelGetRequesterImplPtr;
|
||||
class epicsShareClass PvaClientGet //:
|
||||
// public epics::pvAccess::ChannelGetRequester,
|
||||
// public std::tr1::enable_shared_from_this<PvaClientGet>
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(PvaClientGet);
|
||||
@@ -1063,7 +1064,7 @@ private:
|
||||
|
||||
enum GetState {getIdle,getActive,getComplete};
|
||||
GetState getState;
|
||||
friend class ChannelGetRequesterImpl;
|
||||
ChannelGetRequesterImplPtr channelGetRequester;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1175,7 +1176,6 @@ private :
|
||||
|
||||
enum PutState {putIdle,getActive,putActive};
|
||||
PutState putState;
|
||||
friend class ChannelPutRequesterImpl;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1311,7 +1311,6 @@ private :
|
||||
|
||||
enum PutGetState {putGetIdle,putGetActive,putGetComplete};
|
||||
PutGetState putGetState;
|
||||
friend class ChannelPutGetRequesterImpl;
|
||||
};
|
||||
|
||||
//class ChannelMonitorRequester; // private to PvaClientMonitor
|
||||
@@ -1464,7 +1463,6 @@ private:
|
||||
MonitorConnectState connectState;
|
||||
bool userPoll;
|
||||
bool userWait;
|
||||
friend class ChannelMonitorRequester;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
@@ -122,6 +122,63 @@ size_t PvaClientPutCache::cacheSize()
|
||||
|
||||
}
|
||||
|
||||
class ChannelRequesterImpl : public ChannelRequester
|
||||
{
|
||||
PvaClientChannel::weak_pointer pvaClientChannel;
|
||||
PvaClient::weak_pointer pvaClient;
|
||||
public:
|
||||
ChannelRequesterImpl(
|
||||
PvaClientChannelPtr const & pvaClientChannel,
|
||||
PvaClientPtr const &pvaClient)
|
||||
: pvaClientChannel(pvaClientChannel),
|
||||
pvaClient(pvaClient)
|
||||
{}
|
||||
virtual ~ChannelRequesterImpl() {
|
||||
if(PvaClient::getDebug()) std::cout << "~ChannelRequesterImpl" << std::endl;
|
||||
}
|
||||
|
||||
virtual std::string getRequesterName() {
|
||||
PvaClientChannelPtr clientChannel(pvaClientChannel.lock());
|
||||
if(!clientChannel) return string("clientChannel is null");
|
||||
return clientChannel->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
PvaClientChannelPtr clientChannel(pvaClientChannel.lock());
|
||||
if(!clientChannel) return;
|
||||
clientChannel->message(message,messageType);
|
||||
}
|
||||
|
||||
virtual void channelCreated(
|
||||
const epics::pvData::Status& status,
|
||||
Channel::shared_pointer const & channel)
|
||||
{
|
||||
PvaClientChannelPtr clientChannel(pvaClientChannel.lock());
|
||||
if(!clientChannel) return;
|
||||
clientChannel->channelCreated(status,channel);
|
||||
}
|
||||
|
||||
virtual void channelStateChange(
|
||||
Channel::shared_pointer const & channel,
|
||||
Channel::ConnectionState connectionState)
|
||||
{
|
||||
PvaClientChannelPtr clientChannel(pvaClientChannel.lock());
|
||||
if(!clientChannel) return;
|
||||
clientChannel->channelStateChange(channel,connectionState);
|
||||
}
|
||||
};
|
||||
|
||||
PvaClientChannelPtr PvaClientChannel::create(
|
||||
PvaClientPtr const &pvaClient,
|
||||
string const & channelName,
|
||||
string const & providerName)
|
||||
{
|
||||
PvaClientChannelPtr channel(new PvaClientChannel(pvaClient,channelName,providerName));
|
||||
channel->channelRequester = ChannelRequesterImplPtr(
|
||||
new ChannelRequesterImpl(channel,pvaClient));
|
||||
return channel;
|
||||
}
|
||||
|
||||
|
||||
PvaClientChannel::PvaClientChannel(
|
||||
PvaClientPtr const &pvaClient,
|
||||
@@ -282,7 +339,7 @@ void PvaClientChannel::issueConnect()
|
||||
if(!provider) {
|
||||
throw std::runtime_error(channelName + " provider " + providerName + " not registered");
|
||||
}
|
||||
ChannelRequester::shared_pointer channelRequester(shared_from_this());
|
||||
// ChannelRequester::shared_pointer channelRequester(shared_from_this());
|
||||
if(PvaClient::getDebug()) cout << "PvaClientChannel::issueConnect calling provider->createChannel\n";
|
||||
channel = provider->createChannel(channelName,channelRequester,ChannelProvider::PRIORITY_DEFAULT);
|
||||
if(!channel) {
|
||||
@@ -540,13 +597,5 @@ size_t PvaClientChannel::cacheSize()
|
||||
}
|
||||
|
||||
|
||||
PvaClientChannelPtr PvaClientChannel::create(
|
||||
PvaClientPtr const &pvaClient,
|
||||
string const & channelName,
|
||||
string const & providerName)
|
||||
{
|
||||
PvaClientChannelPtr channel(new PvaClientChannel(pvaClient,channelName,providerName));
|
||||
return channel;
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
@@ -22,30 +22,67 @@ using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
{
|
||||
PvaClientGet * pvaClientGet;
|
||||
PvaClientGet::weak_pointer pvaClientGet;
|
||||
PvaClient::weak_pointer pvaClient;
|
||||
public:
|
||||
ChannelGetRequesterImpl(PvaClientGet * pvaClientGet)
|
||||
: pvaClientGet(pvaClientGet) {}
|
||||
string getRequesterName()
|
||||
{return pvaClientGet->getRequesterName();}
|
||||
void message(string const & message,MessageType messageType)
|
||||
{pvaClientGet->message(message,messageType);}
|
||||
void channelGetConnect(
|
||||
ChannelGetRequesterImpl(
|
||||
PvaClientGetPtr const & pvaClientGet,
|
||||
PvaClientPtr const &pvaClient)
|
||||
: pvaClientGet(pvaClientGet),
|
||||
pvaClient(pvaClient)
|
||||
{}
|
||||
virtual ~ChannelGetRequesterImpl() {
|
||||
if(PvaClient::getDebug()) std::cout << "~ChannelGetRequesterImpl" << std::endl;
|
||||
}
|
||||
|
||||
virtual std::string getRequesterName() {
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return string("clientGet is null");
|
||||
return clientGet->getRequesterName();
|
||||
}
|
||||
|
||||
virtual void message(std::string const & message, epics::pvData::MessageType messageType) {
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return;
|
||||
clientGet->message(message,messageType);
|
||||
}
|
||||
|
||||
virtual void channelGetConnect(
|
||||
const Status& status,
|
||||
ChannelGet::shared_pointer const & channelGet,
|
||||
StructureConstPtr const & structure)
|
||||
{pvaClientGet->channelGetConnect(status,channelGet,structure);}
|
||||
void getDone(
|
||||
Structure::const_shared_pointer const & structure)
|
||||
{
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return;
|
||||
clientGet->channelGetConnect(status,channelGet,structure);
|
||||
}
|
||||
|
||||
virtual void getDone(
|
||||
const Status& status,
|
||||
ChannelGet::shared_pointer const & channelGet,
|
||||
PVStructurePtr const & pvStructure,
|
||||
BitSetPtr const & bitSet)
|
||||
{pvaClientGet->getDone(status,channelGet,pvStructure,bitSet);}
|
||||
BitSet::shared_pointer const & bitSet)
|
||||
{
|
||||
PvaClientGetPtr clientGet(pvaClientGet.lock());
|
||||
if(!clientGet) return;
|
||||
clientGet->getDone(status,channelGet,pvStructure,bitSet);
|
||||
}
|
||||
};
|
||||
|
||||
PvaClientGetPtr PvaClientGet::create(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
PVStructurePtr const &pvRequest)
|
||||
{
|
||||
PvaClientGetPtr epv(new PvaClientGet(pvaClient,channel,pvRequest));
|
||||
epv->channelGetRequester = ChannelGetRequesterImplPtr(
|
||||
new ChannelGetRequesterImpl(epv,pvaClient));
|
||||
return epv;
|
||||
}
|
||||
|
||||
|
||||
PvaClientGet::PvaClientGet(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
@@ -166,11 +203,11 @@ void PvaClientGet::issueConnect()
|
||||
+ " pvaClientGet already connected ";
|
||||
throw std::runtime_error(message);
|
||||
}
|
||||
ChannelGetRequester::shared_pointer getRequester(shared_from_this());
|
||||
// ChannelGetRequester::shared_pointer channelGetRequester(shared_from_this());
|
||||
connectState = connectActive;
|
||||
Channel::shared_pointer chan(channel.lock());
|
||||
if(chan) {
|
||||
channelGet = chan->createChannelGet(getRequester,pvRequest);
|
||||
channelGet = chan->createChannelGet(channelGetRequester,pvRequest);
|
||||
return;
|
||||
}
|
||||
throw std::runtime_error("PvaClientGet::issueConnect channel was destroyed");
|
||||
@@ -257,13 +294,5 @@ PvaClientGetDataPtr PvaClientGet::getData()
|
||||
return pvaClientData;
|
||||
}
|
||||
|
||||
PvaClientGetPtr PvaClientGet::create(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
PVStructurePtr const &pvRequest)
|
||||
{
|
||||
PvaClientGetPtr epv(new PvaClientGet(pvaClient,channel,pvRequest));
|
||||
return epv;
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
@@ -22,27 +22,6 @@ using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
|
||||
class ChannelProcessRequesterImpl : public ChannelProcessRequester
|
||||
{
|
||||
PvaClientProcess * pvaClientProcess;
|
||||
public:
|
||||
ChannelProcessRequesterImpl(PvaClientProcess * pvaClientProcess)
|
||||
: pvaClientProcess(pvaClientProcess) {}
|
||||
string getRequesterName()
|
||||
{return pvaClientProcess->getRequesterName();}
|
||||
void message(string const & message,MessageType messageType)
|
||||
{pvaClientProcess->message(message,messageType);}
|
||||
void channelProcessConnect(
|
||||
const Status& status,
|
||||
ChannelProcess::shared_pointer const & channelProcess)
|
||||
{pvaClientProcess->channelProcessConnect(status,channelProcess);}
|
||||
void processDone(
|
||||
const Status& status,
|
||||
ChannelProcess::shared_pointer const & channelProcess)
|
||||
{pvaClientProcess->processDone(status,channelProcess);}
|
||||
};
|
||||
|
||||
PvaClientProcess::PvaClientProcess(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
|
||||
@@ -22,33 +22,6 @@ using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
{
|
||||
PvaClientPut * pvaClientPut;
|
||||
public:
|
||||
ChannelPutRequesterImpl(PvaClientPut * pvaClientPut)
|
||||
: pvaClientPut(pvaClientPut) {}
|
||||
string getRequesterName()
|
||||
{return pvaClientPut->getRequesterName();}
|
||||
void message(string const & message,MessageType messageType)
|
||||
{pvaClientPut->message(message,messageType);}
|
||||
void channelPutConnect(
|
||||
const Status& status,
|
||||
ChannelPut::shared_pointer const & channelPut,
|
||||
StructureConstPtr const & structure)
|
||||
{pvaClientPut->channelPutConnect(status,channelPut,structure);}
|
||||
void getDone(
|
||||
const Status& status,
|
||||
ChannelPut::shared_pointer const & channelPut,
|
||||
PVStructurePtr const & pvStructure,
|
||||
BitSetPtr const & bitSet)
|
||||
{pvaClientPut->getDone(status,channelPut,pvStructure,bitSet);}
|
||||
void putDone(
|
||||
const Status& status,
|
||||
ChannelPut::shared_pointer const & channelPut)
|
||||
{pvaClientPut->putDone(status,channelPut);}
|
||||
};
|
||||
|
||||
PvaClientPut::PvaClientPut(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
|
||||
@@ -21,50 +21,6 @@ using namespace std;
|
||||
|
||||
namespace epics { namespace pvaClient {
|
||||
|
||||
class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
{
|
||||
PvaClientPutGet * pvaClientPutGet;
|
||||
public:
|
||||
ChannelPutGetRequesterImpl(PvaClientPutGet * pvaClientPutGet)
|
||||
: pvaClientPutGet(pvaClientPutGet) {}
|
||||
string getRequesterName()
|
||||
{return pvaClientPutGet->getRequesterName();}
|
||||
void message(string const & message,MessageType messageType)
|
||||
{pvaClientPutGet->message(message,messageType);}
|
||||
void channelPutGetConnect(
|
||||
const epics::pvData::Status& status,
|
||||
epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
|
||||
epics::pvData::StructureConstPtr const & putStructure,
|
||||
epics::pvData::StructureConstPtr const & getStructure)
|
||||
{
|
||||
pvaClientPutGet->channelPutGetConnect(status,channelPutGet,putStructure,getStructure);
|
||||
}
|
||||
void putGetDone(
|
||||
const epics::pvData::Status& status,
|
||||
epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
|
||||
epics::pvData::PVStructurePtr const & getPVStructure,
|
||||
epics::pvData::BitSetPtr const & getChangedBitSet)
|
||||
{
|
||||
pvaClientPutGet->putGetDone(status,channelPutGet,getPVStructure,getChangedBitSet);
|
||||
}
|
||||
void getPutDone(
|
||||
const epics::pvData::Status& status,
|
||||
epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
|
||||
epics::pvData::PVStructurePtr const & putPVStructure,
|
||||
epics::pvData::BitSet::shared_pointer const & putBitSet)
|
||||
{
|
||||
pvaClientPutGet->getPutDone(status,channelPutGet,putPVStructure,putBitSet);
|
||||
}
|
||||
void getGetDone(
|
||||
const epics::pvData::Status& status,
|
||||
epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
|
||||
epics::pvData::PVStructurePtr const & getPVStructure,
|
||||
epics::pvData::BitSet::shared_pointer const & getChangedBitSet)
|
||||
{
|
||||
pvaClientPutGet->getGetDone(status,channelPutGet,getPVStructure,getChangedBitSet);
|
||||
}
|
||||
};
|
||||
|
||||
PvaClientPutGet::PvaClientPutGet(
|
||||
PvaClientPtr const &pvaClient,
|
||||
Channel::shared_pointer const & channel,
|
||||
|
||||
Reference in New Issue
Block a user