From 40fb22ebd916ea7614d6da245d9aabd1996fcfa5 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 17 May 2016 14:26:41 -0400 Subject: [PATCH] add destroy to pvaClientChannel; in pvaClientGet channel is weak_pointer --- src/pv/pvaClient.h | 15 +++++++++------ src/pvaClient.cpp | 8 +++++++- src/pvaClientChannel.cpp | 16 +++++++++++++--- src/pvaClientGet.cpp | 40 ++++++++++++++++++++++++++++++++-------- 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/pv/pvaClient.h b/src/pv/pvaClient.h index 11e839a..1ff9806 100644 --- a/src/pv/pvaClient.h +++ b/src/pv/pvaClient.h @@ -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; diff --git a/src/pvaClient.cpp b/src/pvaClient.cpp index 3305d3c..8cc1a75 100644 --- a/src/pvaClient.cpp +++ b/src/pvaClient.cpp @@ -38,7 +38,13 @@ public: PvaClientChannelCache(){} ~PvaClientChannelCache(){ if(PvaClient::getDebug()) cout << "PvaClientChannelCache::~PvaClientChannelCache\n"; - pvaClientChannelMap.clear(); + map::iterator iter; + for(iter = pvaClientChannelMap.begin(); iter != pvaClientChannelMap.end(); ++iter) + { + PvaClientChannelPtr pvaChannel = iter->second; + pvaChannel->destroy(); + } +// pvaClientChannelMap.clear(); } PvaClientChannelPtr getChannel( string const & channelName, diff --git a/src/pvaClientChannel.cpp b/src/pvaClientChannel.cpp index ed6467a..542a466 100644 --- a/src/pvaClientChannel.cpp +++ b/src/pvaClientChannel.cpp @@ -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(); - } diff --git a/src/pvaClientGet.cpp b/src/pvaClientGet.cpp index a3515c2..500b46f 100644 --- a/src/pvaClientGet.cpp +++ b/src/pvaClientGet.cpp @@ -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); }