still working on RAII

This commit is contained in:
mrkraimer
2016-05-20 06:22:13 -04:00
parent 3920215182
commit 643fa9b40b
6 changed files with 123 additions and 139 deletions

View File

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

View File

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

View File

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

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,