summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-12-11 23:20:34 +0000
committerAlan Conway <aconway@apache.org>2007-12-11 23:20:34 +0000
commit589869335599f4850a41560f2f27db2a64221a70 (patch)
tree5cfd4b0dff553eb107e0040a31b6648c95c48a14 /qpid/cpp/src
parent189e13ebdbd40826b2d3beef6d95b695677a0289 (diff)
downloadqpid-python-589869335599f4850a41560f2f27db2a64221a70.tar.gz
Fixed client crash on error opening a connection.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@603411 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionHandler.cpp16
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionImpl.cpp1
2 files changed, 12 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
index cbdeff9cff..df84a98811 100644
--- a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
+++ b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
@@ -102,12 +102,18 @@ void ConnectionHandler::waitForOpen()
void ConnectionHandler::close()
{
- if (getState() != OPEN) {
- throw Exception("Connection not open");
+ switch (getState()) {
+ case NEGOTIATING:
+ case OPENING:
+ setState(FAILED);
+ break;
+ case OPEN:
+ setState(CLOSING);
+ send(ConnectionCloseBody(version, 200, OK, 0, 0));
+ waitFor(CLOSED);
+ break;
+ // Nothing to do for CLOSING, CLOSED, FAILED or NOT_STARTED
}
- setState(CLOSING);
- send(ConnectionCloseBody(version, 200, OK, 0, 0));
- waitFor(CLOSED);
}
void ConnectionHandler::send(const framing::AMQBody& body)
diff --git a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
index cf00b2b296..ea467429a1 100644
--- a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
+++ b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
@@ -88,6 +88,7 @@ void ConnectionImpl::open(const std::string& host, int port,
void ConnectionImpl::close()
{
+ Mutex::ScopedLock l(lock);
if (!isClosed)
handler.close();
}