From a1a2e71ecc74593f32b3426bf77516e835931172 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 29 Jun 2018 16:02:05 -0700 Subject: [PATCH] fix ServerCancelRequestHandler::handleResponse Thus far this has been dead code as ServerChannel::getRequest() returned a Destroyable which was actually a BaseChannelRequester sub-class, not a ChannelRequest sub-class. --- src/server/pv/baseChannelRequester.h | 5 ++++- src/server/pv/responseHandlers.h | 12 ++++++++++++ src/server/responseHandlers.cpp | 5 +---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/server/pv/baseChannelRequester.h b/src/server/pv/baseChannelRequester.h index fd79998..607c54c 100644 --- a/src/server/pv/baseChannelRequester.h +++ b/src/server/pv/baseChannelRequester.h @@ -16,6 +16,7 @@ namespace epics { namespace pvAccess { class ServerChannel; +class ChannelRequest; class BaseChannelRequester : virtual public epics::pvData::Requester, public Destroyable { @@ -28,7 +29,9 @@ public: bool startRequest(epics::pvData::int32 qos); void stopRequest(); epics::pvData::int32 getPendingRequest(); - std::string getRequesterName() OVERRIDE FINAL; + //! The Operation associated with this Requester, except for GetField and Monitor (which are special snowflakes...) + virtual std::tr1::shared_ptr getOperation() =0; + virtual std::string getRequesterName() OVERRIDE FINAL; virtual void message(std::string const & message, epics::pvData::MessageType messageType) OVERRIDE FINAL; static void message(Transport::shared_pointer const & transport, const pvAccessID ioid, const std::string message, const epics::pvData::MessageType messageType); static void sendFailureMessage(const epics::pvData::int8 command, Transport::shared_pointer const & transport, const pvAccessID ioid, const epics::pvData::int8 qos, const epics::pvData::Status status); diff --git a/src/server/pv/responseHandlers.h b/src/server/pv/responseHandlers.h index 291ccc2..b8f62b0 100644 --- a/src/server/pv/responseHandlers.h +++ b/src/server/pv/responseHandlers.h @@ -303,6 +303,7 @@ public: virtual void destroy() OVERRIDE FINAL; ChannelGet::shared_pointer getChannelGet(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelGet(); } virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; private: @@ -360,6 +361,8 @@ public: virtual void destroy() OVERRIDE FINAL; ChannelPut::shared_pointer getChannelPut(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelPut(); } + epics::pvData::BitSet::shared_pointer getPutBitSet(); epics::pvData::PVStructure::shared_pointer getPutPVStructure(); void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control); @@ -423,6 +426,7 @@ public: virtual void destroy() OVERRIDE FINAL; ChannelPutGet::shared_pointer getChannelPutGet(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelPutGet(); } epics::pvData::PVStructure::shared_pointer getPutGetPVStructure(); epics::pvData::BitSet::shared_pointer getPutGetBitSet(); @@ -485,6 +489,8 @@ public: virtual void destroy() OVERRIDE FINAL; Monitor::shared_pointer getChannelMonitor(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return std::tr1::shared_ptr(); } + virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; void ack(size_t cnt); private: @@ -557,6 +563,7 @@ public: virtual void destroy() OVERRIDE FINAL; ChannelArray::shared_pointer getChannelArray(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelArray(); } epics::pvData::PVArray::shared_pointer getPVArray(); virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; @@ -654,6 +661,8 @@ public: virtual void destroy() OVERRIDE FINAL; ChannelProcess::shared_pointer getChannelProcess(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelProcess(); } + virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; private: @@ -695,6 +704,8 @@ public: std::tr1::shared_ptr const & channel, const pvAccessID ioid, Transport::shared_pointer const & transport); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return std::tr1::shared_ptr(); } + virtual ~ServerGetFieldRequesterImpl() {} virtual void getDone(const epics::pvData::Status& status, epics::pvData::FieldConstPtr const & field) OVERRIDE FINAL; virtual void destroy() OVERRIDE FINAL; @@ -773,6 +784,7 @@ public: * @return the channelRPC */ ChannelRPC::shared_pointer getChannelRPC(); + virtual std::tr1::shared_ptr getOperation() OVERRIDE FINAL { return getChannelRPC(); } virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; private: diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 831e201..dcd41b0 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -2615,17 +2615,14 @@ void ServerCancelRequestHandler::handleResponse(osiSockAddr* responseFrom, return; } - ChannelRequest::shared_pointer cr = dynamic_pointer_cast(request); + ChannelRequest::shared_pointer cr = dynamic_pointer_cast(request->getOperation()); if (!cr) { failureResponse(transport, ioid, BaseChannelRequester::notAChannelRequestStatus); return; } - // never gets here - // cancel cr->cancel(); - } void ServerCancelRequestHandler::failureResponse(Transport::shared_pointer const & transport, pvAccessID ioid, const Status& errorStatus)