summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/client/Connector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/client/Connector.cpp')
-rw-r--r--cpp/src/qpid/client/Connector.cpp35
1 files changed, 17 insertions, 18 deletions
diff --git a/cpp/src/qpid/client/Connector.cpp b/cpp/src/qpid/client/Connector.cpp
index ef7c9ce7fd..17b68c1f6a 100644
--- a/cpp/src/qpid/client/Connector.cpp
+++ b/cpp/src/qpid/client/Connector.cpp
@@ -47,7 +47,9 @@ Connector::Connector(
{ }
Connector::~Connector(){
- close();
+ closeInternal();
+ if (receiver.id())
+ receiver.join();
}
void Connector::connect(const std::string& host, int port){
@@ -62,11 +64,19 @@ void Connector::init(){
writeBlock(&init);
}
-void Connector::close(){
- if (markClosed()) {
+// Call with closedLock held
+bool Connector::closeInternal() {
+ Mutex::ScopedLock l(closedLock);
+ if (!closed) {
socket.close();
- receiver.join();
+ closed = true;
+ return true;
}
+ return false;
+}
+
+void Connector::close() {
+ closeInternal();
}
void Connector::setInputHandler(InputHandler* handler){
@@ -108,20 +118,9 @@ void Connector::writeToSocket(char* data, size_t available){
}
}
-void Connector::handleClosed(){
- if (markClosed()) {
- socket.close();
- if(shutdownHandler) shutdownHandler->shutdown();
- }
-}
-
-bool Connector::markClosed(){
- if (closed) {
- return false;
- } else {
- closed = true;
- return true;
- }
+void Connector::handleClosed() {
+ if (closeInternal() && shutdownHandler)
+ shutdownHandler->shutdown();
}
void Connector::checkIdle(ssize_t status){