summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/client/ConnectionImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/client/ConnectionImpl.cpp')
-rw-r--r--cpp/src/qpid/client/ConnectionImpl.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/cpp/src/qpid/client/ConnectionImpl.cpp b/cpp/src/qpid/client/ConnectionImpl.cpp
index c48a580fe8..e4e7b2f5c2 100644
--- a/cpp/src/qpid/client/ConnectionImpl.cpp
+++ b/cpp/src/qpid/client/ConnectionImpl.cpp
@@ -188,13 +188,16 @@ void ConnectionImpl::idleOut()
void ConnectionImpl::close()
{
- if (heartbeatTask) {
+ if (heartbeatTask)
heartbeatTask->cancel();
+ // close() must be idempotent and no-throw as it will often be called in destructors.
+ if (handler.isOpen()) {
+ try {
+ handler.close();
+ closed(CLOSE_CODE_NORMAL, "Closed by client");
+ } catch (...) {}
}
-
- if (!handler.isOpen()) return;
- handler.close();
- closed(CLOSE_CODE_NORMAL, "Closed by client");
+ assert(!handler.isOpen());
}