ca provider destruction fixed

resolves #53
This commit is contained in:
Matej Sekoranja
2016-06-14 22:34:14 +02:00
parent ce6ea1e51d
commit 3a73cb687b
4 changed files with 51 additions and 8 deletions

View File

@@ -25,13 +25,15 @@ using namespace epics::pvAccess::ca;
std::string CAChannelProvider::PROVIDER_NAME = "ca";
CAChannelProvider::CAChannelProvider() : current_context(0)
CAChannelProvider::CAChannelProvider() : current_context(0), destroyed(false)
{
initialize();
}
CAChannelProvider::~CAChannelProvider()
{
// call destroy() to destroy CA context
destroy();
}
std::string CAChannelProvider::getProviderName()
@@ -107,11 +109,17 @@ void CAChannelProvider::destroy()
{
Lock lock(channelsMutex);
{
if (destroyed)
return;
destroyed = true;
while (!channels.empty())
{
Channel::shared_pointer channel = channels.rbegin()->second.lock();
Channel::shared_pointer channel = channels.begin()->second.lock();
if (channel)
channel->destroy();
else
channels.erase(channels.begin());
}
}
@@ -136,6 +144,12 @@ void CAChannelProvider::unregisterChannel(Channel::shared_pointer const & channe
channels.erase(channel.get());
}
void CAChannelProvider::unregisterChannel(Channel* pchannel)
{
Lock lock(channelsMutex);
channels.erase(pchannel);
}
void CAChannelProvider::initialize()
{
/* Create Channel Access */