add destroy to pvaClientChannel; in pvaClientGet channel is weak_pointer
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user