diff options
author | Gordon Sim <gsim@apache.org> | 2007-08-06 08:49:27 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2007-08-06 08:49:27 +0000 |
commit | 27ed31a51bae606bf4d32d75770bbb8c3ff75687 (patch) | |
tree | cfce1a2685a92b2edab662d86aa2289923cfafbf /qpid/cpp/src | |
parent | 8a3ee0d00155c442256217d9e4f5edc1257e9d9f (diff) | |
download | qpid-python-27ed31a51bae606bf4d32d75770bbb8c3ff75687.tar.gz |
Fixed race in connection shutdown preventing Connector from being garbage collected on occasion.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@563067 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qpid/client/ConnectionHandler.cpp | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/client/ConnectionImpl.cpp | 7 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/client/ConnectionImpl.h | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/client/Connector.cpp | 6 |
4 files changed, 7 insertions, 10 deletions
diff --git a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp index f20f597d1f..f47506d977 100644 --- a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp +++ b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp @@ -185,10 +185,10 @@ void ConnectionHandler::handle(AMQMethodBody::shared_ptr method) break; case CLOSING: if (method->isA<ConnectionCloseOkBody>()) { - setState(CLOSED); if (onClose) { onClose(); } + setState(CLOSED); } else { QPID_LOG(warning, "Received frame on channel zero while closing connection; frame ignored."); } diff --git a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp index 887790e4f0..47c01f2d67 100644 --- a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp +++ b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp @@ -30,6 +30,7 @@ ConnectionImpl::ConnectionImpl(boost::shared_ptr<Connector> c) : connector(c) handler.in = boost::bind(&ConnectionImpl::incoming, this, _1); handler.out = boost::bind(&Connector::send, connector, _1); handler.onClose = boost::bind(&ConnectionImpl::closed, this); + handler.onError = boost::bind(&ConnectionImpl::closedByPeer, this, _1, _2); connector->setInputHandler(&handler); connector->setTimeoutHandler(this); connector->setShutdownHandler(this); @@ -88,10 +89,10 @@ void ConnectionImpl::close() void ConnectionImpl::closed() { - closed(200, "OK"); + closedByPeer(200, "OK"); } -void ConnectionImpl::closed(uint16_t code, const std::string& text) +void ConnectionImpl::closedByPeer(uint16_t code, const std::string& text) { for (SessionMap::iterator i = sessions.begin(); i != sessions.end(); i++) { i->second->closed(code, text); @@ -114,7 +115,7 @@ void ConnectionImpl::idleOut() void ConnectionImpl::shutdown() { //this indicates that the socket to the server has closed for (SessionMap::iterator i = sessions.begin(); i != sessions.end(); i++) { - i->second->closed(0, "Unexpected scoket closure."); + i->second->closed(0, "Unexpected socket closure."); } sessions.clear(); } diff --git a/qpid/cpp/src/qpid/client/ConnectionImpl.h b/qpid/cpp/src/qpid/client/ConnectionImpl.h index 8b46d774bf..e37713e77d 100644 --- a/qpid/cpp/src/qpid/client/ConnectionImpl.h +++ b/qpid/cpp/src/qpid/client/ConnectionImpl.h @@ -47,7 +47,7 @@ class ConnectionImpl : public framing::FrameHandler, void incoming(framing::AMQFrame& frame); void closed(); - void closed(uint16_t, const std::string&); + void closedByPeer(uint16_t, const std::string&); void idleOut(); void idleIn(); void shutdown(); diff --git a/qpid/cpp/src/qpid/client/Connector.cpp b/qpid/cpp/src/qpid/client/Connector.cpp index d92a177465..21346fe652 100644 --- a/qpid/cpp/src/qpid/client/Connector.cpp +++ b/qpid/cpp/src/qpid/client/Connector.cpp @@ -47,11 +47,7 @@ Connector::Connector( outbuf(send_buffer_size) { } -Connector::~Connector(){ - closeInternal(); - if (receiver.id()) - receiver.join(); -} +Connector::~Connector(){} void Connector::connect(const std::string& host, int port){ socket.connect(host, port); |