summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2010-06-01 18:54:56 +0000
committerGordon Sim <gsim@apache.org>2010-06-01 18:54:56 +0000
commitfff0a43d69db6e62f1a21d52f752bf59c35fbd2a (patch)
tree3056cb2bd7a35fc02ffe44b4ec0eff09f38da4be
parent69626719cfa36529eeb6db0a163257b95616d719 (diff)
downloadqpid-python-fff0a43d69db6e62f1a21d52f752bf59c35fbd2a.tar.gz
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
-rw-r--r--qpid/cpp/src/qpid/sys/AsynchIOHandler.cpp11
-rw-r--r--qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp10
2 files changed, 8 insertions, 13 deletions
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);
}
/*