19 #define epicsExportSharedSymbols 31 #define EXCEPTION_GUARD(code) try { code; } \ 32 catch (std::exception &e) { LOG(logLevelError, "Unhandled exception caught from client code at %s:%d: %s", __FILE__, __LINE__, e.what()); } \ 33 catch (...) { LOG(logLevelError, "Unhandled exception caught from client code at %s:%d.", __FILE__, __LINE__); } 49 std::cout<<
"CAChannelProvider::CAChannelProvider\n";
57 std::cout <<
"CAChannelProvider::~CAChannelProvider()" 58 <<
" caChannelList.size() " << caChannelList.size()
61 std::queue<CAChannelPtr> channelQ;
64 for(
size_t i=0;
i< caChannelList.size(); ++
i)
67 if(caChannel) channelQ.push(caChannel);
69 caChannelList.clear();
71 while(!channelQ.empty()) {
73 std::cout <<
"~CAChannelProvider() calling disconnectChannel " 74 << channelQ.front()->getChannelName()
77 channelQ.front()->disconnectChannel();
80 putDoneThread->stop();
81 getDoneThread->stop();
82 monitorEventThread->stop();
83 channelConnectThread->stop();
85 std::cout <<
"CAChannelProvider::~CAChannelProvider() calling ca_context_destroy\n";
97 std::string
const & channelName,
98 ChannelFindRequester::shared_pointer
const & channelFindRequester)
100 if (channelName.empty())
101 throw std::invalid_argument(
"CAChannelProvider::channelFind empty channel name");
103 if (!channelFindRequester)
104 throw std::invalid_argument(
"CAChannelProvider::channelFind null requester");
107 ChannelFind::shared_pointer nullChannelFind;
108 EXCEPTION_GUARD(channelFindRequester->channelFindResult(errorStatus, nullChannelFind,
false));
109 return nullChannelFind;
113 ChannelListRequester::shared_pointer
const & channelListRequester)
115 if (!channelListRequester.get())
116 throw std::runtime_error(
"CAChannelProvider::channelList null requester");
119 ChannelFind::shared_pointer nullChannelFind;
121 EXCEPTION_GUARD(channelListRequester->channelListResult(errorStatus, nullChannelFind, none,
false));
122 return nullChannelFind;
126 std::string
const & channelName,
127 ChannelRequester::shared_pointer
const & channelRequester,
130 Channel::shared_pointer channel(
131 createChannel(channelName, channelRequester, priority, std::string()));
136 std::string
const & channelName,
137 ChannelRequester::shared_pointer
const & channelRequester,
139 std::string
const & address)
141 if (!address.empty())
142 throw std::invalid_argument(
"CAChannelProvider::createChannel does not support 'address' parameter");
144 return CAChannel::create(shared_from_this(), channelName, priority, channelRequester);
150 std::cout <<
"CAChannelProvider::addChannel " 151 << channel->getChannelName()
155 for(
size_t i=0;
i< caChannelList.size(); ++
i) {
156 if(!(caChannelList[
i].
lock())) {
157 caChannelList[
i] = channel;
161 caChannelList.push_back(channel);
179 if (thread_context == current_context)
return;
183 std::string mess(
"CAChannelProvider::attachContext error calling ca_attach_context ");
185 throw std::runtime_error(mess);
189 void CAChannelProvider::initialize()
191 if(
DEBUG_LEVEL>0) std::cout <<
"CAChannelProvider::initialize()\n";
194 std::string mess(
"CAChannelProvider::initialize error calling ca_context_create ");
196 throw std::runtime_error(mess);
203 if(
DEBUG_LEVEL>0) std::cout <<
"CAClientFactory::start()\n";
211 throw std::runtime_error(
"CAClientFactory::start failed");
void addChannel(const CAChannelPtr &channel)
LIBCOM_API void epicsStdCall epicsSignalInstallSigPipeIgnore(void)
virtual ~CAChannelProvider()
virtual ChannelFind::shared_pointer channelList(ChannelListRequester::shared_pointer const &channelListRequester)
virtual ChannelFind::shared_pointer channelFind(std::string const &channelName, ChannelFindRequester::shared_pointer const &channelFindRequester)
TODO only here because of the Lockable.
A lock for multithreading.
int epicsStdCall ca_attach_context(struct ca_client_context *pCtx)
static CAChannelPtr create(CAChannelProvider::shared_pointer const &channelProvider, std::string const &channelName, short priority, ChannelRequester::shared_pointer const &channelRequester)
std::tr1::shared_ptr< CAChannel > CAChannelPtr
int epicsStdCall ca_context_create(ca_preemptive_callback_select premptiveCallbackSelect)
Extended replacement for the Posix exit and atexit routines.
virtual void configure(epics::pvData::PVStructure::shared_pointer configuration)
static ChannelProviderRegistry::shared_pointer clients()
LIBCOM_API void epicsStdCall epicsSignalInstallSigAlarmIgnore(void)
virtual Channel::shared_pointer createChannel(std::string const &channelName, ChannelRequester::shared_pointer const &channelRequester, short priority)
static void stop()
stop provider ca
const char *epicsStdCall ca_message(long ca_status)
#define EXCEPTION_GUARD(code)
OS-independent routines for ignoring Posix signals.
void epicsStdCall ca_context_destroy()
C++ and C descriptions for a thread.
static void start()
start provider ca
struct ca_client_context *epicsStdCall ca_current_context()
virtual std::string getProviderName()