From 5c5da3b515eb1f8d1dc4a628f6e6c86c0fe1cdd2 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 29 Jan 2018 13:53:25 -0500 Subject: [PATCH] Revert "When caProvider is destroyed make sure all channels are cleared" --- src/ca/caChannel.cpp | 44 ++++++++++------------------------- src/ca/caChannel.h | 7 +++--- src/ca/caProvider.cpp | 52 +++++++----------------------------------- src/ca/caProviderPvt.h | 9 -------- 4 files changed, 23 insertions(+), 89 deletions(-) diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index d145a71..a1e3c90 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -374,8 +374,7 @@ CAChannel::CAChannel(std::string const & _channelName, channelRequester(_channelRequester), channelID(0), channelType(0), - elementCount(0), - channelCreated(false) + elementCount(0) { if(DEBUG_LEVEL>0) { cout<< "CAChannel::CAChannel " << channelName << endl; @@ -396,9 +395,6 @@ void CAChannel::activate(short priority) &channelID); if (result == ECA_NORMAL) { - channelCreated = true; - CAChannelProviderPtr provider(channelProvider.lock()); - if(provider) provider->addChannel(shared_from_this()); req->channelCreated(Status::Ok, shared_from_this()); } else { Status errorStatus(Status::STATUSTYPE_ERROR, string(ca_message(result))); @@ -406,33 +402,6 @@ void CAChannel::activate(short priority) } } -CAChannel::~CAChannel() -{ - if(DEBUG_LEVEL>0) { - cout << "CAChannel::~CAChannel() " << channelName << endl; - } - disconnectChannel(); -} - -void CAChannel::disconnectChannel() -{ - if(DEBUG_LEVEL>0) { - cout << "CAChannel::disconnectChannel() " - << channelName - << " channelCreated " << (channelCreated ? "true" : "false") - << endl; - } - { - Lock lock(requestsMutex); - if(!channelCreated) return; - } - /* Clear CA Channel */ - threadAttach(); - ca_clear_channel(channelID); -} - - - void CAChannel::addChannelGet(const CAChannelGetPtr & get) { if(DEBUG_LEVEL>0) { @@ -479,6 +448,17 @@ void CAChannel::addChannelMonitor(const CAChannelMonitorPtr & monitor) monitorList.push_back(monitor); } +CAChannel::~CAChannel() +{ + if(DEBUG_LEVEL>0) { + cout << "CAChannel::~CAChannel() " << channelName << endl; + } + /* Clear CA Channel */ + threadAttach(); + ca_clear_channel(channelID); +} + + chid CAChannel::getChannelID() { return channelID; diff --git a/src/ca/caChannel.h b/src/ca/caChannel.h index 72d201c..cdb716b 100644 --- a/src/ca/caChannel.h +++ b/src/ca/caChannel.h @@ -22,7 +22,8 @@ namespace epics { namespace pvAccess { namespace ca { - +class CAChannel; +typedef std::tr1::shared_ptr CAChannelPtr; class CAChannelGetField; typedef std::tr1::shared_ptr CAChannelGetFieldPtr; typedef std::tr1::weak_ptr CAChannelGetFieldWPtr; @@ -59,7 +60,7 @@ public: static size_t num_instances; - static CAChannelPtr create(CAChannelProvider::shared_pointer const & channelProvider, + static shared_pointer create(CAChannelProvider::shared_pointer const & channelProvider, std::string const & channelName, short priority, ChannelRequester::shared_pointer const & channelRequester); @@ -111,7 +112,6 @@ public: void addChannelGet(const CAChannelGetPtr & get); void addChannelPut(const CAChannelPutPtr & get); void addChannelMonitor(const CAChannelMonitorPtr & get); - void disconnectChannel(); private: @@ -129,7 +129,6 @@ private: chid channelID; chtype channelType; unsigned elementCount; - bool channelCreated; epics::pvData::Structure::const_shared_pointer structure; epics::pvData::Mutex requestsMutex; diff --git a/src/ca/caProvider.cpp b/src/ca/caProvider.cpp index e7fb52e..3da9c69 100644 --- a/src/ca/caProvider.cpp +++ b/src/ca/caProvider.cpp @@ -52,28 +52,7 @@ CAChannelProvider::CAChannelProvider(const std::tr1::shared_ptr&) CAChannelProvider::~CAChannelProvider() { - if(DEBUG_LEVEL>0) { - std::cout << "CAChannelProvider::~CAChannelProvider()" - << " caChannelList.size() " << caChannelList.size() - << std::endl; - } - std::queue channelQ; - { - Lock lock(channelListMutex); - for(size_t i=0; i< caChannelList.size(); ++i) { - CAChannelPtr caChannel(caChannelList[i].lock()); - if(caChannel) channelQ.push(caChannel); - } - } - while(!channelQ.empty()) { - if(DEBUG_LEVEL>0) { - std::cout << "disconnectAllChannels calling disconnectChannel " - << channelQ.front()->getChannelName() - << std::endl; - } - channelQ.front()->disconnectChannel(); - channelQ.pop(); - } + if(DEBUG_LEVEL>0) std::cout << "CAChannelProvider::~CAChannelProvider()\n"; } std::string CAChannelProvider::getProviderName() @@ -133,23 +112,6 @@ Channel::shared_pointer CAChannelProvider::createChannel( return CAChannel::create(shared_from_this(), channelName, priority, channelRequester); } -void CAChannelProvider::addChannel(const CAChannelPtr & channel) -{ - if(DEBUG_LEVEL>0) { - std::cout << "CAChannelProvider::addChannel " - << channel->getChannelName() - << std::endl; - } - Lock lock(channelListMutex); - for(size_t i=0; i< caChannelList.size(); ++i) { - if(!(caChannelList[i].lock())) { - caChannelList[i] = channel; - return; - } - } - caChannelList.push_back(channel); -} - void CAChannelProvider::configure(epics::pvData::PVStructure::shared_pointer /*configuration*/) { } @@ -174,11 +136,13 @@ void CAChannelProvider::initialize() /* Create Channel Access */ int result = ca_context_create(ca_enable_preemptive_callback); if (result != ECA_NORMAL) { - throw std::runtime_error( - std::string("CA error %s occurred while trying to start channel access:") - + ca_message(result)); + throw std::runtime_error(std::string("CA error %s occurred while trying " + "to start channel access:") + ca_message(result)); } + current_context = ca_current_context(); + + // TODO create a ca_poll thread, if ca_disable_preemptive_callback } @@ -190,7 +154,7 @@ void ca_factory_cleanup(void*) ChannelProviderRegistry::clients()->remove("ca"); ca_context_destroy(); } catch(std::exception& e) { - LOG(logLevelWarn, "Error on unregistering \"ca\" factory: %s", e.what()); + LOG(logLevelWarn, "Error when unregister \"ca\" factory"); } } @@ -209,7 +173,7 @@ void CAClientFactory::start() registerRefCounter("CAChannelPut", &CAChannelPut::num_instances); registerRefCounter("CAChannelMonitor", &CAChannelMonitor::num_instances); - if(ChannelProviderRegistry::clients()->add("ca", true)) + if(ChannelProviderRegistry::clients()->add("ca", false)) { epicsAtExit(&ca_factory_cleanup, NULL); } diff --git a/src/ca/caProviderPvt.h b/src/ca/caProviderPvt.h index 6d01361..3e4b3a5 100644 --- a/src/ca/caProviderPvt.h +++ b/src/ca/caProviderPvt.h @@ -19,10 +19,6 @@ namespace ca { #define DEBUG_LEVEL 0 -class CAChannel; -typedef std::tr1::shared_ptr CAChannelPtr; -typedef std::tr1::weak_ptr CAChannelWPtr; - class CAChannelProvider; typedef std::tr1::shared_ptr CAChannelProviderPtr; typedef std::tr1::weak_ptr CAChannelProviderWPtr; @@ -68,18 +64,13 @@ public: virtual void destroy() EPICS_DEPRECATED {}; - void addChannel(const CAChannelPtr & get); - /* ---------------------------------------------------------------- */ void threadAttach(); - private: void initialize(); ca_client_context* current_context; - epics::pvData::Mutex channelListMutex; - std::vector caChannelList; }; }