From 0beb3149a1f868ef90a8ecb64d921c9cd00f4a2e Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 6 Jan 2016 22:35:30 +0100 Subject: [PATCH] server: channel destroyed before CHANNEL_CREATE message is sent --- src/server/responseHandlers.cpp | 53 ++++++++++++++++----------------- src/server/responseHandlers.h | 1 - 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 02654dd..8a6980f 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -815,7 +815,7 @@ void ServerChannelRequesterImpl::channelCreated(const Status& status, Channel::s LOG(logLevelDebug, "Exception caught when creating channel: %s", _channelName.c_str()); { Lock guard(_mutex); - _status = Status(Status::STATUSTYPE_FATAL, "failed to create channel", e.what()); + _status = Status(Status::STATUSTYPE_FATAL, "failed to create channel", e.what()); } TransportSender::shared_pointer thisSender = shared_from_this(); transport->enqueueSendRequest(thisSender); @@ -828,7 +828,7 @@ void ServerChannelRequesterImpl::channelCreated(const Status& status, Channel::s LOG(logLevelDebug, "Exception caught when creating channel: %s", _channelName.c_str()); { Lock guard(_mutex); - _status = Status(Status::STATUSTYPE_FATAL, "failed to create channel"); + _status = Status(Status::STATUSTYPE_FATAL, "failed to create channel"); } TransportSender::shared_pointer thisSender = shared_from_this(); transport->enqueueSendRequest(thisSender); @@ -905,32 +905,29 @@ void ServerChannelRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* status = _status; } - // error response - if (serverChannel.get() == NULL) - { - createChannelFailedResponse(buffer, control, status); - } - // OK - else if (Transport::shared_pointer transport = _transport.lock()) - { - ServerChannelImpl::shared_pointer serverChannelImpl = dynamic_pointer_cast(serverChannel); - control->startMessage((int8)CMD_CREATE_CHANNEL, 2*sizeof(int32)/sizeof(int8)); - buffer->putInt(serverChannelImpl->getCID()); - buffer->putInt(serverChannelImpl->getSID()); - status.serialize(buffer, control); - } -} - - -void ServerChannelRequesterImpl::createChannelFailedResponse(ByteBuffer* buffer, TransportSendControl* control, const Status& status) -{ - if (Transport::shared_pointer transport = _transport.lock()) - { - control->startMessage((int8)CMD_CREATE_CHANNEL, 2*sizeof(int32)/sizeof(int8)); - buffer->putInt(_cid); - buffer->putInt(-1); - status.serialize(buffer, control); - } + if (Transport::shared_pointer transport = _transport.lock()) + { + // error response + if (!serverChannel) + { + control->startMessage((int8)CMD_CREATE_CHANNEL, 2*sizeof(int32)/sizeof(int8)); + buffer->putInt(_cid); + buffer->putInt(-1); + // error status is expected or channel has been destroyed locally + if (status.isSuccess()) + status = Status(Status::STATUSTYPE_ERROR, "channel has been destroyed"); + status.serialize(buffer, control); + } + // OK + else + { + ServerChannelImpl::shared_pointer serverChannelImpl = dynamic_pointer_cast(serverChannel); + control->startMessage((int8)CMD_CREATE_CHANNEL, 2*sizeof(int32)/sizeof(int8)); + buffer->putInt(serverChannelImpl->getCID()); + buffer->putInt(serverChannelImpl->getSID()); + status.serialize(buffer, control); + } + } } /****************************************************************************************/ diff --git a/src/server/responseHandlers.h b/src/server/responseHandlers.h index fa8eef7..3ceaf71 100644 --- a/src/server/responseHandlers.h +++ b/src/server/responseHandlers.h @@ -263,7 +263,6 @@ namespace pvAccess { ChannelSecuritySession::shared_pointer const & _css; epics::pvData::Status _status; epics::pvData::Mutex _mutex; - void createChannelFailedResponse(epics::pvData::ByteBuffer* buffer, TransportSendControl* control, const epics::pvData::Status& status); }; /****************************************************************************************/