From fff0a43d69db6e62f1a21d52f752bf59c35fbd2a Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Tue, 1 Jun 2010 18:54:56 +0000 Subject: QPID-2636: Ensure close is called for a disconnect preventing occasional leaks of abruptly terminated connections git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@950201 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp | 11 +++++------ qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp | 10 +++------- 2 files changed, 8 insertions(+), 13 deletions(-) (limited to 'qpid/cpp') diff --git a/qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp b/qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp index 5771141d08..30a87d9d44 100644 --- a/qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp +++ b/qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp @@ -173,9 +173,8 @@ void AsynchIOHandler::readbuff(AsynchIO& , AsynchIO::BufferBase* buff) { } } -void AsynchIOHandler::eof(AsynchIO&) { - QPID_LOG(debug, "DISCONNECTED [" << identifier << "]"); - if (codec) codec->closed(); +void AsynchIOHandler::eof(AsynchIO& a) { + disconnect(a); readError = true; aio->queueWriteClose(); } @@ -190,9 +189,9 @@ void AsynchIOHandler::closedSocket(AsynchIO&, const Socket& s) { delete this; } -void AsynchIOHandler::disconnect(AsynchIO& a) { - // treat the same as eof - eof(a); +void AsynchIOHandler::disconnect(AsynchIO&) { + QPID_LOG(debug, "DISCONNECTED [" << identifier << "]"); + if (codec) codec->closed(); } // Notifications diff --git a/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp b/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp index fd7886145b..cef9f1fcef 100644 --- a/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp +++ b/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp @@ -554,13 +554,9 @@ void AsynchIO::writeable(DispatchHandle& h) { } void AsynchIO::disconnected(DispatchHandle& h) { - // If we've already queued close do it instead of disconnected callback - if (queuedClose) { - close(h); - } else if (disCallback) { - disCallback(*this); - h.unwatch(); - } + // If we have not already queued close then call disconnected callback before closing + if (!queuedClose && disCallback) disCallback(*this); + close(h); } /* -- cgit v1.2.1