Make the channelConnectThread per-provider
This passes the tests (on MacOS).
This commit is contained in:

committed by
mdavidsaver

parent
601280836d
commit
2729903a10
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,6 @@ private:
|
||||
chid channelID;
|
||||
bool channelCreated;
|
||||
bool channelConnected;
|
||||
ChannelConnectThreadPtr channelConnectThread;
|
||||
NotifyChannelRequesterPtr notifyChannelRequester;
|
||||
|
||||
epics::pvData::Mutex requestsMutex;
|
||||
|
@ -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";
|
||||
|
@ -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;
|
||||
|
@ -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 ¬ifyChannelRequester)
|
||||
{
|
||||
|
@ -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 ¬ifyChannelRequester);
|
||||
private:
|
||||
ChannelConnectThread();
|
||||
bool stopping() {
|
||||
pvData::Lock the(mutex);
|
||||
return isStop;
|
||||
|
Reference in New Issue
Block a user