summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2007-08-06 08:49:27 +0000
committerGordon Sim <gsim@apache.org>2007-08-06 08:49:27 +0000
commit27ed31a51bae606bf4d32d75770bbb8c3ff75687 (patch)
treecfce1a2685a92b2edab662d86aa2289923cfafbf /qpid/cpp/src
parent8a3ee0d00155c442256217d9e4f5edc1257e9d9f (diff)
downloadqpid-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.cpp2
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionImpl.cpp7
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionImpl.h2
-rw-r--r--qpid/cpp/src/qpid/client/Connector.cpp6
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);