From f39174cb74c27c5e1db1e362d8816c64d4cf47fa Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 17 Jul 2018 20:42:21 -0700 Subject: [PATCH 1/7] StaticProvider need to expose iterator type --- src/server/pva/server.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/pva/server.h b/src/server/pva/server.h index 89c54cc..3bd2196 100644 --- a/src/server/pva/server.h +++ b/src/server/pva/server.h @@ -121,6 +121,7 @@ public: private: typedef std::map > builders_t; public: + typedef builders_t::const_iterator const_iterator; //! Build a new, empty, provider. //! @param name Provider Name. Only relevant if registerAsServer() is called, then must be unique in this process. @@ -144,8 +145,8 @@ public: std::tr1::shared_ptr provider() const; // iterate through currently add()'d PVs. Iteraters are invalidated by concurrent add() or remove() - builders_t::const_iterator begin() const; - builders_t::const_iterator end() const; + const_iterator begin() const; + const_iterator end() const; }; /** @brief A Provider which has no pre-configured list of names. From 8b60d87e429456fa08d33e77c0e66f19d8c572c0 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 31 Jul 2018 16:50:27 -0700 Subject: [PATCH 2/7] pvac fix MailboxHandler This is why OVERRIDE is so important... --- src/server/sharedstate_pv.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/sharedstate_pv.cpp b/src/server/sharedstate_pv.cpp index dc6ab66..082168a 100644 --- a/src/server/sharedstate_pv.cpp +++ b/src/server/sharedstate_pv.cpp @@ -26,9 +26,9 @@ namespace { struct MailboxHandler : public pvas::SharedPV::Handler { virtual ~MailboxHandler() {} - virtual void onPut(pvas::SharedPV& self, pvas::Operation& op) + virtual void onPut(const pvas::SharedPV::shared_pointer& self, pvas::Operation& op) OVERRIDE FINAL { - self.post(op.value(), op.changed()); + self->post(op.value(), op.changed()); op.info("Set!"); op.complete(); } From e52d31d0bf476b07f0dad6426643f7ba84c7d3b0 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 31 Jul 2018 17:22:18 -0700 Subject: [PATCH 3/7] Get2PutProxy pass along messages --- src/client/pvAccess.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index 9089683..7975f74 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -216,6 +216,14 @@ struct Get2PutProxy : public ChannelGet return req ? req->getRequesterName() : ""; } + virtual void message(const std::string &message, MessageType messageType) OVERRIDE FINAL { + ChannelGetRequester::shared_pointer req(requester.lock()); + if(req) + req->message(message, messageType); + else + ChannelPutRequester::message(message, messageType); + } + virtual void channelDisconnect(bool destroy) OVERRIDE FINAL { ChannelGetRequester::shared_pointer req(requester.lock()); if(req) From 9ec087c7ed740f72860711b2f50ce192bc83477a Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 1 Aug 2018 09:40:09 -0400 Subject: [PATCH 4/7] fix issue 118; add put/get equal tests for pvScalar --- src/ca/dbdToPv.cpp | 4 ++-- testCa/testCaProvider.cpp | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ca/dbdToPv.cpp b/src/ca/dbdToPv.cpp index 636dc5e..09f30f7 100644 --- a/src/ca/dbdToPv.cpp +++ b/src/ca/dbdToPv.cpp @@ -392,7 +392,7 @@ Status DbdToPv::getFromDBD( copy_DBRScalarArray(value,count,pvValue); break; case DBR_LONG: - copy_DBRScalarArray(value,count,pvValue); + copy_DBRScalarArray(value,count,pvValue); break; case DBR_FLOAT: copy_DBRScalarArray(value,count,pvValue); @@ -430,7 +430,7 @@ Status DbdToPv::getFromDBD( case DBR_STRING: copy_DBRScalar(value,pvValue); break; case DBR_CHAR: copy_DBRScalar(value,pvValue); break; case DBR_SHORT: copy_DBRScalar(value,pvValue); break; - case DBR_LONG: copy_DBRScalar(value,pvValue); break; + case DBR_LONG: copy_DBRScalar(value,pvValue); break; case DBR_FLOAT: copy_DBRScalar(value,pvValue); break; case DBR_DOUBLE: copy_DBRScalar(value,pvValue); break; default: diff --git a/testCa/testCaProvider.cpp b/testCa/testCaProvider.cpp index ff275d3..ec02e8b 100644 --- a/testCa/testCaProvider.cpp +++ b/testCa/testCaProvider.cpp @@ -573,6 +573,7 @@ private: TestClient(string const &channelName,PVStructurePtr const & pvRequest); string channelName; PVStructurePtr pvRequest; + string putValue; TestChannelPtr testChannel; TestChannelGetPtr testChannelGet; TestChannelPutPtr testChannelPut; @@ -611,8 +612,14 @@ void TestClient::getDone( testOk(pvStructure->getSubField("timeStamp").get() != 0,"timeStamp not null"); testOk(pvStructure->getSubField("alarm").get() != 0,"alarm not null"); if (DEBUG) std::cout << testChannel->getChannelName() + " TestClient::getDone" + << " putValue " << putValue << " bitSet " << *bitSet << " pvStructure\n" << pvStructure << "\n"; + PVScalarPtr pvScalar = pvStructure->getSubField("value"); + if(pvScalar) { + string getValue = getConvert()->toString(pvScalar); + testOk(getValue.compare(putValue)==0,"getValue==putValue"); + } waitForGet.signal(); } @@ -649,6 +656,7 @@ void TestClient::put(string const & value) { testDiag("TestClient::put %s := %s", testChannel->getChannelName().c_str(), value.c_str()); + putValue = value; testChannelPut->put(value); waitPut(OPERATION_TIMEOUT); } @@ -756,7 +764,7 @@ void checkClient(const string &channelName, const string &putValue) MAIN(testCaProvider) { - testPlan(84 + EXIT_TESTS); + testPlan(87 + EXIT_TESTS); TestIocPtr testIoc(new TestIoc()); testIoc->start(); @@ -766,10 +774,8 @@ MAIN(testCaProvider) ChannelProviderRegistry::shared_pointer reg(ChannelProviderRegistry::clients()); try { ChannelProvider::shared_pointer channelProvider(reg->getProvider("ca")); - if (!channelProvider) - testAbort("Channel provider 'ca' not registered"); - - checkClient("DBRlongout", "5"); + if (!channelProvider) testAbort("Channel provider 'ca' not registered"); + checkClient("DBRlongout", "32768"); checkClient("DBRdoubleout", "1.5"); checkClient("DBRstringout", "test"); checkClient("DBRbyteArray", "1 2 3"); From f210c81e451478c40aab3e57364a72d9e20ac276 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Thu, 2 Aug 2018 05:55:22 -0400 Subject: [PATCH 5/7] fix issue 119 --- src/ca/caChannel.cpp | 17 +++++++++++++++-- src/ca/caChannel.h | 7 ++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index b19349b..f1f4e64 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -62,6 +62,10 @@ void CAChannel::connected() if(DEBUG_LEVEL>0) { cout<< "CAChannel::connected " << channelName << endl; } + while(!getFieldQueue.empty()) { + getFieldQueue.front()->activate(); + getFieldQueue.pop(); + } while(!putQueue.empty()) { putQueue.front()->activate(); putQueue.pop(); @@ -230,7 +234,8 @@ void CAChannel::getField(GetFieldRequester::shared_pointer const & requester, if(DEBUG_LEVEL>0) { cout << "CAChannel::getField " << channelName << endl; } - CAChannelGetFieldPtr getField(new CAChannelGetField(requester,subField)); + CAChannelGetFieldPtr getField( + new CAChannelGetField(shared_from_this(),requester,subField)); { Lock lock(requestsMutex); if(getConnectionState()!=Channel::CONNECTED) { @@ -344,8 +349,10 @@ void CAChannel::printInfo(std::ostream& out) CAChannelGetField::CAChannelGetField( + CAChannelPtr const &channel, GetFieldRequester::shared_pointer const & requester,std::string const & subField) - : getFieldRequester(requester), + : channel(channel), + getFieldRequester(requester), subField(subField) { if(DEBUG_LEVEL>0) { @@ -353,6 +360,12 @@ CAChannelGetField::CAChannelGetField( } } +void CAChannelGetField::activate() +{ + CAChannelPtr chan(channel.lock()); + if(chan) callRequester(chan); +} + CAChannelGetField::~CAChannelGetField() { if(DEBUG_LEVEL>0) { diff --git a/src/ca/caChannel.h b/src/ca/caChannel.h index 8228627..d5835cd 100644 --- a/src/ca/caChannel.h +++ b/src/ca/caChannel.h @@ -63,10 +63,15 @@ class CAChannelGetField : { public: POINTER_DEFINITIONS(CAChannelGetField); - CAChannelGetField(GetFieldRequester::shared_pointer const & requester,std::string const & subField); + CAChannelGetField( + CAChannelPtr const &channel, + GetFieldRequester::shared_pointer const & requester, + std::string const & subField); ~CAChannelGetField(); void callRequester(CAChannelPtr const & caChannel); + void activate(); private: + CAChannelWPtr channel; GetFieldRequester::weak_pointer getFieldRequester; std::string subField; }; From 07af87fb0b99e98011a59ed5ef43d713457a674d Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 6 Aug 2018 18:59:50 -0700 Subject: [PATCH 6/7] pva/client.h RPC give dummy valid bit mask avoid the need for a NULL check. --- src/client/clientRPC.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/clientRPC.cpp b/src/client/clientRPC.cpp index 04cfab2..ff52a3e 100644 --- a/src/client/clientRPC.cpp +++ b/src/client/clientRPC.cpp @@ -141,6 +141,9 @@ struct RPCer : public pva::ChannelRPCRequester, event.message.clear(); } event.value = pvResponse; + pvd::BitSetPtr valid(new pvd::BitSet(1)); + valid->set(0); + event.valid = valid; callEvent(G, status.isSuccess()? pvac::GetEvent::Success : pvac::GetEvent::Fail); } From bef689d8c827e642627dda1e9b0718a9207d7e1f Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Mon, 13 Aug 2018 09:12:57 -0400 Subject: [PATCH 7/7] add more DBRlongout tests --- testCa/testCaProvider.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/testCa/testCaProvider.cpp b/testCa/testCaProvider.cpp index ec02e8b..b92c462 100644 --- a/testCa/testCaProvider.cpp +++ b/testCa/testCaProvider.cpp @@ -764,7 +764,7 @@ void checkClient(const string &channelName, const string &putValue) MAIN(testCaProvider) { - testPlan(87 + EXIT_TESTS); + testPlan(143 + EXIT_TESTS); TestIocPtr testIoc(new TestIoc()); testIoc->start(); @@ -775,7 +775,15 @@ MAIN(testCaProvider) try { ChannelProvider::shared_pointer channelProvider(reg->getProvider("ca")); if (!channelProvider) testAbort("Channel provider 'ca' not registered"); + checkClient("DBRlongout", "0"); + checkClient("DBRlongout", "1"); + checkClient("DBRlongout", "-1"); + checkClient("DBRlongout", "32767"); checkClient("DBRlongout", "32768"); + checkClient("DBRlongout", "-32768"); + checkClient("DBRlongout", "-32769"); + checkClient("DBRlongout", "2147483647"); + checkClient("DBRlongout", "-2147483648"); checkClient("DBRdoubleout", "1.5"); checkClient("DBRstringout", "test"); checkClient("DBRbyteArray", "1 2 3");