add destroy to pvaClientChannel; in pvaClientGet channel is weak_pointer

This commit is contained in:
mrkraimer
2016-05-17 14:26:41 -04:00
parent cd9bdec84e
commit 40fb22ebd9
4 changed files with 61 additions and 18 deletions

View File

@@ -236,6 +236,10 @@ class epicsShareClass PvaClientChannel :
public:
POINTER_DEFINITIONS(PvaClientChannel);
~PvaClientChannel();
/** Destroy the connection to the server.
*
*/
void destroy();
/** ChannelRequester method
* @param status The status
* @param channel The channel
@@ -455,10 +459,6 @@ public:
{
return shared_from_this();
}
/** Deprecated method
* \deprecated This method will go away in future versions.
*/
void destroy() EPICS_DEPRECATED {}
private:
static PvaClientChannelPtr create(
@@ -1035,7 +1035,10 @@ public:
/** Deprecated method
* \deprecated This method will go away in future versions.
*/
void destroy() EPICS_DEPRECATED {}
void destroy() EPICS_DEPRECATED
{
channelGet->destroy();
}
private:
PvaClientGet(
PvaClientPtr const &pvaClient,
@@ -1046,7 +1049,7 @@ private:
enum GetConnectState {connectIdle,connectActive,connected};
PvaClient::weak_pointer pvaClient;
epics::pvAccess::Channel::shared_pointer channel;
epics::pvAccess::Channel::weak_pointer channel;
epics::pvData::PVStructurePtr pvRequest;
epics::pvData::Mutex mutex;
epics::pvData::Event waitForConnect;

View File

@@ -38,7 +38,13 @@ public:
PvaClientChannelCache(){}
~PvaClientChannelCache(){
if(PvaClient::getDebug()) cout << "PvaClientChannelCache::~PvaClientChannelCache\n";
pvaClientChannelMap.clear();
map<string,PvaClientChannelPtr>::iterator iter;
for(iter = pvaClientChannelMap.begin(); iter != pvaClientChannelMap.end(); ++iter)
{
PvaClientChannelPtr pvaChannel = iter->second;
pvaChannel->destroy();
}
// pvaClientChannelMap.clear();
}
PvaClientChannelPtr getChannel(
string const & channelName,

View File

@@ -149,17 +149,27 @@ PvaClientChannel::~PvaClientChannel()
<< " this " << this << " channel " << channel
<< endl;
}
{
destroy();
}
void PvaClientChannel::destroy()
{
{
Lock xx(mutex);
if(isDestroyed) return;
isDestroyed = true;
}
if(PvaClient::getDebug()) {
cout << "PvaClientChannel::destroy() "
<< " channelName " << channelName
<< " this " << this << " channel " << channel
<< endl;
}
if(PvaClient::getDebug()) showCache();
if(channel) channel->destroy();
if(channel) channel.reset();
if(channel) channel.reset();
pvaClientGetCache.reset();
pvaClientPutCache.reset();
}

View File

@@ -107,7 +107,8 @@ void PvaClientGet::channelGetConnect(
this->channelGet = channelGet;
if(status.isOK()) {
pvaClientData = PvaClientGetData::create(structure);
pvaClientData->setMessagePrefix(channel->getChannelName());
Channel::shared_pointer chan(channel.lock());
if(chan) pvaClientData->setMessagePrefix(chan->getChannelName());
}
}
waitForConnect.signal();
@@ -138,7 +139,10 @@ void PvaClientGet::connect()
issueConnect();
Status status = waitConnect();
if(status.isOK()) return;
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " PvaClientGet::connect " + status.getMessage();
throw std::runtime_error(message);
}
@@ -147,13 +151,21 @@ void PvaClientGet::issueConnect()
{
if(isDestroyed) throw std::runtime_error("pvaClientGet was destroyed");
if(connectState!=connectIdle) {
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " pvaClientGet already connected ";
throw std::runtime_error(message);
}
ChannelGetRequester::shared_pointer getRequester(shared_from_this());
connectState = connectActive;
channelGet = channel->createChannelGet(getRequester,pvRequest);
Channel::shared_pointer chan(channel.lock());
if(chan) {
channelGet = chan->createChannelGet(getRequester,pvRequest);
return;
}
throw std::runtime_error("PvaClientGet::issueConnect channel was destroyed");
}
Status PvaClientGet::waitConnect()
@@ -166,7 +178,10 @@ Status PvaClientGet::waitConnect()
return channelGetConnectStatus;
}
if(connectState!=connectActive) {
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " pvaClientGet illegal connect state ";
throw std::runtime_error(message);
}
@@ -182,7 +197,10 @@ void PvaClientGet::get()
issueGet();
Status status = waitGet();
if(status.isOK()) return;
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " PvaClientGet::get " + status.getMessage();
throw std::runtime_error(message);
}
@@ -192,7 +210,10 @@ void PvaClientGet::issueGet()
if(isDestroyed) throw std::runtime_error("pvaClientGet was destroyed");
if(connectState==connectIdle) connect();
if(getState!=getIdle) {
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " PvaClientGet::issueGet get aleady active ";
throw std::runtime_error(message);
}
@@ -210,7 +231,10 @@ Status PvaClientGet::waitGet()
return channelGetStatus;
}
if(getState!=getActive){
string message = string("channel ") + channel->getChannelName()
Channel::shared_pointer chan(channel.lock());
string channelName("disconnected");
if(chan) channelName = chan->getChannelName();
string message = string("channel ") + channelName
+ " PvaClientGet::waitGet llegal get state";
throw std::runtime_error(message);
}