Revert "When caProvider is destroyed make sure all channels are cleared"

This commit is contained in:
Marty Kraimer
2018-01-29 13:53:25 -05:00
committed by GitHub
parent a14cca78e0
commit 5c5da3b515
4 changed files with 23 additions and 89 deletions
+12 -32
View File
@@ -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;
+3 -4
View File
@@ -22,7 +22,8 @@ namespace epics {
namespace pvAccess {
namespace ca {
class CAChannel;
typedef std::tr1::shared_ptr<CAChannel> CAChannelPtr;
class CAChannelGetField;
typedef std::tr1::shared_ptr<CAChannelGetField> CAChannelGetFieldPtr;
typedef std::tr1::weak_ptr<CAChannelGetField> 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;
+8 -44
View File
@@ -52,28 +52,7 @@ CAChannelProvider::CAChannelProvider(const std::tr1::shared_ptr<Configuration>&)
CAChannelProvider::~CAChannelProvider()
{
if(DEBUG_LEVEL>0) {
std::cout << "CAChannelProvider::~CAChannelProvider()"
<< " caChannelList.size() " << caChannelList.size()
<< std::endl;
}
std::queue<CAChannelPtr> 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<CAChannelProvider>("ca", true))
if(ChannelProviderRegistry::clients()->add<CAChannelProvider>("ca", false))
{
epicsAtExit(&ca_factory_cleanup, NULL);
}
-9
View File
@@ -19,10 +19,6 @@ namespace ca {
#define DEBUG_LEVEL 0
class CAChannel;
typedef std::tr1::shared_ptr<CAChannel> CAChannelPtr;
typedef std::tr1::weak_ptr<CAChannel> CAChannelWPtr;
class CAChannelProvider;
typedef std::tr1::shared_ptr<CAChannelProvider> CAChannelProviderPtr;
typedef std::tr1::weak_ptr<CAChannelProvider> 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<CAChannelWPtr> caChannelList;
};
}