From e1b8587be5a2b0e16cfb0ef33d13e42997a0cfe4 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 31 Jul 2012 12:52:24 +0200 Subject: [PATCH] ChannelXYZ parameter on failure, ChannelArrayImpl lock of count/offset/... --- TODO | 3 -- .../remoteClient/clientContextImpl.cpp | 43 ++++++++++++------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/TODO b/TODO index 6d1d479..c905822 100644 --- a/TODO +++ b/TODO @@ -6,9 +6,6 @@ readSize checks if size is in limits of size_t? 1. protected void destroy(boolean createRequestFailed) { -2. reuse on reconnect !!! -3. initResponse failed: should I give non-null instance or thisPtr? -4. channelArray need to lock offset, conut, .. diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index 2eacbba..9d5e3c3 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -760,8 +760,8 @@ namespace epics { virtual bool initResponse(Transport::shared_pointer const & transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (!status.isSuccess()) { - ChannelPut::shared_pointer nullChannelPut; - EXCEPTION_GUARD(m_channelPutRequester->channelPutConnect(status, nullChannelPut, nullPVStructure, nullBitSet)); + ChannelPut::shared_pointer thisChannelPut = dynamic_pointer_cast(shared_from_this()); + EXCEPTION_GUARD(m_channelPutRequester->channelPutConnect(status, thisChannelPut, nullPVStructure, nullBitSet)); return true; } @@ -986,8 +986,8 @@ namespace epics { virtual bool initResponse(Transport::shared_pointer const & transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (!status.isSuccess()) { - ChannelPutGet::shared_pointer nullChannelPutGet; - EXCEPTION_GUARD(m_channelPutGetRequester->channelPutGetConnect(status, nullChannelPutGet, nullPVStructure, nullPVStructure)); + ChannelPutGet::shared_pointer thisChannelPutGet = dynamic_pointer_cast(shared_from_this()); + EXCEPTION_GUARD(m_channelPutGetRequester->channelPutGetConnect(status, thisChannelPutGet, nullPVStructure, nullPVStructure)); return true; } @@ -1268,8 +1268,8 @@ namespace epics { virtual bool initResponse(Transport::shared_pointer const & transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (!status.isSuccess()) { - ChannelRPC::shared_pointer nullChannelRPC; - EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(status, nullChannelRPC)); + ChannelRPC::shared_pointer thisChannelRPC = dynamic_pointer_cast(shared_from_this()); + EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(status, thisChannelRPC)); return true; } @@ -1437,11 +1437,13 @@ namespace epics { } else if (pendingRequest & QOS_GET) { + // lock... see comment below SerializeHelper::writeSize(m_offset, buffer, control); SerializeHelper::writeSize(m_count, buffer, control); } else if (pendingRequest & QOS_GET_PUT) // i.e. setLength { + // lock... see comment below SerializeHelper::writeSize(m_length, buffer, control); SerializeHelper::writeSize(m_capacity, buffer, control); } @@ -1469,8 +1471,8 @@ namespace epics { virtual bool initResponse(Transport::shared_pointer const & transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (!status.isSuccess()) { - ChannelArray::shared_pointer nullChannelArray; - EXCEPTION_GUARD(m_channelArrayRequester->channelArrayConnect(status, nullChannelArray, PVArray::shared_pointer())); + ChannelArray::shared_pointer thisChannelArray = dynamic_pointer_cast(shared_from_this()); + EXCEPTION_GUARD(m_channelArrayRequester->channelArrayConnect(status, thisChannelArray, PVArray::shared_pointer())); return true; } @@ -1537,8 +1539,11 @@ namespace epics { } try { - m_offset = offset; - m_count = count; + { + Lock lock(m_structureMutex); + m_offset = offset; + m_count = count; + } m_channel->checkAndGetTransport()->enqueueSendRequest(shared_from_this()); } catch (std::runtime_error &rte) { stopRequest(); @@ -1566,8 +1571,11 @@ namespace epics { } try { - m_offset = offset; - m_count = count; + { + Lock lock(m_structureMutex); + m_offset = offset; + m_count = count; + } m_channel->checkAndGetTransport()->enqueueSendRequest(shared_from_this()); } catch (std::runtime_error &rte) { stopRequest(); @@ -1595,8 +1603,11 @@ namespace epics { } try { - m_length = length; - m_capacity = capacity; + { + Lock lock(m_structureMutex); + m_length = length; + m_capacity = capacity; + } m_channel->checkAndGetTransport()->enqueueSendRequest(shared_from_this()); } catch (std::runtime_error &rte) { stopRequest(); @@ -2164,8 +2175,8 @@ namespace epics { virtual bool initResponse(Transport::shared_pointer const & transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (!status.isSuccess()) { - Monitor::shared_pointer nullChannelMonitor; - EXCEPTION_GUARD(m_monitorRequester->monitorConnect(status, nullChannelMonitor, StructureConstPtr())); + Monitor::shared_pointer thisChannelMonitor = dynamic_pointer_cast(shared_from_this()); + EXCEPTION_GUARD(m_monitorRequester->monitorConnect(status, thisChannelMonitor, StructureConstPtr())); return true; }