From 932d90ff7034961c72783724180114632a2f5489 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 18 Jul 2017 06:01:53 -0400 Subject: [PATCH] minor changes --- src/Makefile | 2 +- src/pv/pvaClient.h | 3 +- src/pvaClientGet.cpp | 63 ++++++++++++++++++++++++++++++++++++-- src/pvaClientMonitor.cpp | 66 ++++++++++++++++++++++++---------------- src/pvaClientPut.cpp | 46 +++++++++++++++++++++++++--- 5 files changed, 143 insertions(+), 37 deletions(-) diff --git a/src/Makefile b/src/Makefile index 7e945c7..ffa1083 100644 --- a/src/Makefile +++ b/src/Makefile @@ -31,7 +31,7 @@ LIBSRCS += pvaClientNTMultiGet.cpp LIBSRCS += pvaClientNTMultiMonitor.cpp LIBSRCS += pvaClientRPC.cpp -pvaClient_LIBS += pvAccess nt pvData Com +pvaClient_LIBS += pvAccessCA pvAccess nt pvData Com pvaClient_LIBS += $(EPICS_BASE_IOC_LIBS) include $(TOP)/configure/RULES diff --git a/src/pv/pvaClient.h b/src/pv/pvaClient.h index 560a5a2..53e8cbd 100644 --- a/src/pv/pvaClient.h +++ b/src/pv/pvaClient.h @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -1666,7 +1667,7 @@ private: PvaClientMonitorDataPtr pvaClientData; bool isStarted; - epics::pvData::Status connectStatus; + epics::pvData::Status monitorConnectStatus; epics::pvData::MonitorPtr monitor; epics::pvData::MonitorElementPtr monitorElement; diff --git a/src/pvaClientGet.cpp b/src/pvaClientGet.cpp index b5386d0..83b964b 100644 --- a/src/pvaClientGet.cpp +++ b/src/pvaClientGet.cpp @@ -76,6 +76,12 @@ PvaClientGetPtr PvaClientGet::create( PvaClientChannelPtr const & pvaClientChannel, PVStructurePtr const &pvRequest) { + if(PvaClient::getDebug()) { + cout<< "PvaClientGet::create(pvaClient,channelName,providerName,pvRequest)\n" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << " pvRequest " << pvRequest + << endl; + } PvaClientGetPtr clientGet(new PvaClientGet(pvaClient,pvaClientChannel,pvRequest)); clientGet->channelGetRequester = ChannelGetRequesterImplPtr( new ChannelGetRequesterImpl(clientGet,pvaClient)); @@ -159,12 +165,25 @@ void PvaClientGet::channelStateChange(PvaClientChannelPtr const & pvaClientChann void PvaClientGet::checkGetState() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::checkGetState" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } if(!pvaClientChannel->getChannel()->isConnected()) { string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + " PvaClientGet::checkGetState channel not connected "; throw std::runtime_error(message); } - if(connectState==connectIdle) connect(); + if(connectState==connectIdle) { + connect(); + } + if(connectState==connectActive){ + string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + + " " + + channelGetConnectStatus.getMessage(); + throw std::runtime_error(message); + } if(getState==getIdle) get(); } @@ -196,12 +215,19 @@ void PvaClientGet::channelGetConnect( } { Lock xx(mutex); - channelGetConnectStatus = status; - connectState = connected; this->channelGet = channelGet; if(status.isOK()) { + channelGetConnectStatus = status; + connectState = connected; pvaClientData = PvaClientGetData::create(structure); pvaClientData->setMessagePrefix(channelGet->getChannel()->getChannelName()); + } else { + stringstream ss; + ss << pvRequest; + string message = string("\nPvaClientGet::channelGetConnect)") + + "\npvRequest\n" + ss.str() + + "\nerror\n" + status.getMessage(); + channelGetConnectStatus = Status(Status::STATUSTYPE_ERROR,message); } } PvaClientGetRequesterPtr req(pvaClientGetRequester.lock()); @@ -240,6 +266,11 @@ void PvaClientGet::getDone( void PvaClientGet::connect() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::connect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } issueConnect(); Status status = waitConnect(); if(status.isOK()) return; @@ -250,17 +281,28 @@ void PvaClientGet::connect() void PvaClientGet::issueConnect() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::issueConnect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } if(connectState!=connectIdle) { string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + " pvaClientGet already connected "; throw std::runtime_error(message); } connectState = connectActive; + channelGetConnectStatus = Status(Status::STATUSTYPE_ERROR, "connect active"); channelGet = pvaClientChannel->getChannel()->createChannelGet(channelGetRequester,pvRequest); } Status PvaClientGet::waitConnect() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::waitConnect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } { Lock xx(mutex); if(connectState==connected) { @@ -280,6 +322,11 @@ Status PvaClientGet::waitConnect() void PvaClientGet::get() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::get" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } issueGet(); Status status = waitGet(); if(status.isOK()) return; @@ -290,6 +337,11 @@ void PvaClientGet::get() void PvaClientGet::issueGet() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::issueGet" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } if(connectState==connectIdle) connect(); if(getState==getActive) { string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() @@ -302,6 +354,11 @@ void PvaClientGet::issueGet() Status PvaClientGet::waitGet() { + if(PvaClient::getDebug()) { + cout << "PvaClientGet::waitGet" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } { Lock xx(mutex); if(getState==getComplete) { diff --git a/src/pvaClientMonitor.cpp b/src/pvaClientMonitor.cpp index db2b68b..33088ca 100644 --- a/src/pvaClientMonitor.cpp +++ b/src/pvaClientMonitor.cpp @@ -187,8 +187,17 @@ void PvaClientMonitor::checkMonitorState() << " connectState " << connectState << endl; } - if(connectState==connectIdle) connect(); - if(connectState==connected && !isStarted) start(); + if(connectState==connectIdle) { + connect(); + if(!isStarted) start(); + return; + } + if(connectState==connectActive){ + string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + + " " + + monitorConnectStatus.getMessage(); + throw std::runtime_error(message); + } } string PvaClientMonitor::getRequesterName() @@ -216,17 +225,21 @@ void PvaClientMonitor::monitorConnect( << " status.isOK " << (status.isOK() ? "true" : "false") << endl; } - if(!status.isOK()) { - this->monitor.reset(); - connectState = connectIdle; - string message = string("PvaClientMonitor::monitorConnect channel ") - + pvaClientChannel->getChannel()->getChannelName() - + " " - + status.getMessage(); - throw std::runtime_error(message); + { + Lock xx(mutex); + this->monitor = monitor; + if(!status.isOK()) { + stringstream ss; + ss << pvRequest; + string message = string("\nPvaClientMonitor::monitorConnect)") + + "\npvRequest\n" + ss.str() + + "\nerror\n" + status.getMessage(); + monitorConnectStatus = Status(Status::STATUSTYPE_ERROR,message); + return; + } } bool signal = (connectState==connectWait) ? true : false; - connectStatus = status; + monitorConnectStatus = status; connectState = connected; if(isStarted) { if(PvaClient::getDebug()) { @@ -306,30 +319,29 @@ void PvaClientMonitor::issueConnect() Status PvaClientMonitor::waitConnect() { if(PvaClient::getDebug()) { - cout << "PvaClientMonitor::waitConnect" + cout << "PvaClientMonitor::waitConnect " << pvaClientChannel->getChannel()->getChannelName() << endl; } - if(connectState==connected) { - if(!connectStatus.isOK()) connectState = connectIdle; - return connectStatus; - } - if(connectState!=connectWait) { - string message = string("channel ") - + pvaClientChannel->getChannel()->getChannelName() - + " PvaClientMonitor::waitConnect illegal connect state "; - throw std::runtime_error(message); - } - if(PvaClient::getDebug()) { - cout << "PvaClientMonitor::waitConnect calling waitForConnect.wait\n"; + { + Lock xx(mutex); + if(connectState==connected) { + if(!monitorConnectStatus.isOK()) connectState = connectIdle; + return monitorConnectStatus; + } + if(connectState!=connectWait) { + string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + + " PvaClientMonitor::waitConnect illegal connect state "; + throw std::runtime_error(message); + } } waitForConnect.wait(); - connectState = connectStatus.isOK() ? connected : connectIdle; + connectState = monitorConnectStatus.isOK() ? connected : connectIdle; if(PvaClient::getDebug()) { cout << "PvaClientMonitor::waitConnect" - << " connectStatus " << (connectStatus.isOK() ? "connected" : "not connected"); + << " monitorConnectStatus " << (monitorConnectStatus.isOK() ? "connected" : "not connected"); } - return connectStatus; + return monitorConnectStatus; } void PvaClientMonitor::setRequester(PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester) diff --git a/src/pvaClientPut.cpp b/src/pvaClientPut.cpp index e267ef3..dc5c158 100644 --- a/src/pvaClientPut.cpp +++ b/src/pvaClientPut.cpp @@ -169,14 +169,21 @@ void PvaClientPut::channelStateChange(PvaClientChannelPtr const & pvaClientChann void PvaClientPut::checkPutState() { - if(!pvaClientChannel->getChannel()->isConnected()) { - string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() - + " PvaClientPut::checkPutState channel not connected "; - throw std::runtime_error(message); + if(PvaClient::getDebug()) { + cout << "PvaClientPut::checkPutState" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; } if(connectState==connectIdle){ connect(); get(); + return; + } + if(connectState==connectActive){ + string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + + " " + + channelPutConnectStatus.getMessage(); + throw std::runtime_error(message); } } @@ -207,11 +214,19 @@ void PvaClientPut::channelPutConnect( } { Lock xx(mutex); - channelPutConnectStatus = status; this->channelPut = channelPut; if(status.isOK()) { + channelPutConnectStatus = status; + connectState = connected; pvaClientData = PvaClientPutData::create(structure); pvaClientData->setMessagePrefix(channelPut->getChannel()->getChannelName()); + } else { + stringstream ss; + ss << pvRequest; + string message = string("\nPvaClientPut::channelPutConnect)") + + "\npvRequest\n" + ss.str() + + "\nerror\n" + status.getMessage(); + channelPutConnectStatus = Status(Status::STATUSTYPE_ERROR,message); } } PvaClientPutRequesterPtr req(pvaClientPutRequester.lock()); @@ -269,6 +284,11 @@ void PvaClientPut::putDone( void PvaClientPut::connect() { + if(PvaClient::getDebug()) { + cout << "PvaClientPut::connect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } issueConnect(); Status status = waitConnect(); if(status.isOK()) return; @@ -281,18 +301,29 @@ void PvaClientPut::connect() void PvaClientPut::issueConnect() { + if(PvaClient::getDebug()) { + cout << "PvaClientPut::issueConnect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } if(connectState!=connectIdle) { string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName() + " pvaClientPut already connected "; throw std::runtime_error(message); } connectState = connectActive; + channelPutConnectStatus = Status(Status::STATUSTYPE_ERROR, "connect active"); channelPut = pvaClientChannel->getChannel()->createChannelPut(channelPutRequester,pvRequest); } Status PvaClientPut::waitConnect() { + if(PvaClient::getDebug()) { + cout << "PvaClientPut::waitConnect" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } { Lock xx(mutex); if(connectState==connected) { @@ -389,6 +420,11 @@ Status PvaClientPut::waitPut() PvaClientPutDataPtr PvaClientPut::getData() { + if(PvaClient::getDebug()) { + cout<< "PvaClientPut::getData" + << " channelName " << pvaClientChannel->getChannel()->getChannelName() + << endl; + } checkPutState(); return pvaClientData; }