Make the channelConnectThread per-provider

This passes the tests (on MacOS).
This commit is contained in:
Andrew Johnson
2020-10-02 18:36:29 -05:00
committed by mdavidsaver
parent 601280836d
commit 2729903a10
6 changed files with 25 additions and 49 deletions

View File

@ -53,7 +53,9 @@ void CAChannel::connect(bool isConnected)
Lock lock(requestsMutex);
channelConnected = isConnected;
}
channelConnectThread->channelConnected(notifyChannelRequester);
CAChannelProviderPtr provider(channelProvider.lock());
if (!provider) return;
provider->getChannelConnectThread().channelConnected(notifyChannelRequester);
}
void CAChannel::notifyClient()
@ -107,8 +109,7 @@ CAChannel::CAChannel(std::string const & channelName,
channelRequester(channelRequester),
channelID(0),
channelCreated(false),
channelConnected(false),
channelConnectThread(ChannelConnectThread::get())
channelConnected(false)
{
}

View File

@ -135,7 +135,6 @@ private:
chid channelID;
bool channelCreated;
bool channelConnected;
ChannelConnectThreadPtr channelConnectThread;
NotifyChannelRequesterPtr notifyChannelRequester;
epics::pvData::Mutex requestsMutex;

View File

@ -11,11 +11,6 @@
#include <pv/logger.h>
#include <pv/pvAccess.h>
#include "channelConnectThread.h"
#include "monitorEventThread.h"
#include "getDoneThread.h"
#include "putDoneThread.h"
#define epicsExportSharedSymbols
#include <pv/caProvider.h>
#include "caProviderPvt.h"
@ -34,13 +29,13 @@ CAChannelProvider::CAChannelProvider()
initialize();
}
CAChannelProvider::CAChannelProvider(const std::tr1::shared_ptr<Configuration>&)
: current_context(0),
channelConnectThread(ChannelConnectThread::get()),
monitorEventThread(MonitorEventThread::get()),
getDoneThread(GetDoneThread::get()),
putDoneThread(PutDoneThread::get())
CAChannelProvider::CAChannelProvider(const std::tr1::shared_ptr<Configuration> &)
: current_context(0),
monitorEventThread(MonitorEventThread::get()),
getDoneThread(GetDoneThread::get()),
putDoneThread(PutDoneThread::get())
{
channelConnectThread.start();
initialize();
}
@ -62,13 +57,14 @@ CAChannelProvider::~CAChannelProvider()
channelQ.front()->disconnectChannel();
channelQ.pop();
}
putDoneThread->stop();
getDoneThread->stop();
monitorEventThread->stop();
channelConnectThread->stop();
ca_context_destroy();
}
ChannelConnectThread & CAChannelProvider::getChannelConnectThread()
{
return channelConnectThread;
}
std::string CAChannelProvider::getProviderName()
{
return "ca";

View File

@ -17,6 +17,11 @@
#include <pv/caProvider.h>
#include <pv/pvAccess.h>
#include "channelConnectThread.h"
#include "monitorEventThread.h"
#include "getDoneThread.h"
#include "putDoneThread.h"
namespace epics {
namespace pvAccess {
@ -31,17 +36,6 @@ namespace ca {
LOG(logLevelError, "Unhandled exception from client code at %s:%d.", \
__FILE__, __LINE__); \
}
class ChannelConnectThread;
typedef std::tr1::shared_ptr<ChannelConnectThread> ChannelConnectThreadPtr;
class MonitorEventThread;
typedef std::tr1::shared_ptr<MonitorEventThread> MonitorEventThreadPtr;
class GetDoneThread;
typedef std::tr1::shared_ptr<GetDoneThread> GetDoneThreadPtr;
class PutDoneThread;
typedef std::tr1::shared_ptr<PutDoneThread> PutDoneThreadPtr;
class CAChannel;
typedef std::tr1::shared_ptr<CAChannel> CAChannelPtr;
@ -61,6 +55,8 @@ public:
CAChannelProvider(const std::tr1::shared_ptr<Configuration>&);
virtual ~CAChannelProvider();
ChannelConnectThread& getChannelConnectThread();
/* --------------- epics::pvAccess::ChannelProvider --------------- */
virtual std::string getProviderName();
@ -96,7 +92,7 @@ private:
ca_client_context* current_context;
epics::pvData::Mutex channelListMutex;
std::vector<CAChannelWPtr> caChannelList;
ChannelConnectThreadPtr channelConnectThread;
ChannelConnectThread channelConnectThread;
MonitorEventThreadPtr monitorEventThread;
GetDoneThreadPtr getDoneThread;
PutDoneThreadPtr putDoneThread;

View File

@ -20,18 +20,6 @@ namespace epics {
namespace pvAccess {
namespace ca {
ChannelConnectThreadPtr ChannelConnectThread::get()
{
static ChannelConnectThreadPtr master;
static Mutex mutex;
Lock xx(mutex);
if(!master) {
master = ChannelConnectThreadPtr(new ChannelConnectThread());
master->start();
}
return master;
}
ChannelConnectThread::ChannelConnectThread()
: isStop(false)
{
@ -59,10 +47,6 @@ void ChannelConnectThread::start()
thread->start();
}
void ChannelConnectThread::stop()
{
}
void ChannelConnectThread::channelConnected(
NotifyChannelRequesterPtr const &notifyChannelRequester)
{

View File

@ -15,6 +15,7 @@
#include <epicsThread.h>
#include <pv/event.h>
#include <pv/lock.h>
#include <pv/pvAccess.h>
namespace epics {
namespace pvAccess {
@ -47,14 +48,13 @@ class ChannelConnectThread :
public epicsThreadRunable
{
public:
static ChannelConnectThreadPtr get();
ChannelConnectThread();
~ChannelConnectThread();
virtual void run();
void start();
void stop();
void channelConnected(NotifyChannelRequesterPtr const &notifyChannelRequester);
private:
ChannelConnectThread();
bool stopping() {
pvData::Lock the(mutex);
return isStop;