From 0c02625aa5d0b470c413ba171993f520e9707026 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 26 Jun 2017 14:16:41 +0200 Subject: [PATCH] servercontext wait for transport worker threads to finish doing this through Transport::close() causes deadlock in client code due to locking. So make this an extra step. --- src/remote/codec.cpp | 11 ++++++++--- src/remote/pv/codec.h | 1 + src/remote/pv/remote.h | 3 +++ src/server/serverContext.cpp | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/remote/codec.cpp b/src/remote/codec.cpp index 44cab1f..ddf0984 100644 --- a/src/remote/codec.cpp +++ b/src/remote/codec.cpp @@ -1001,9 +1001,7 @@ bool AbstractCodec::directDeserialize(ByteBuffer *existingBuffer, char* deserial BlockingTCPTransportCodec::~BlockingTCPTransportCodec() { - assert(!_isOpen.get()); - _sendThread.exitWait(); - _readThread.exitWait(); + waitJoin(); } void BlockingTCPTransportCodec::readPollOne() { @@ -1035,6 +1033,13 @@ void BlockingTCPTransportCodec::close() { } } +void BlockingTCPTransportCodec::waitJoin() +{ + assert(!_isOpen.get()); + _sendThread.exitWait(); + _readThread.exitWait(); +} + void BlockingTCPTransportCodec::internalClose(bool /*force*/) { this->internalDestroy(); diff --git a/src/remote/pv/codec.h b/src/remote/pv/codec.h index c9480cf..88f075d 100644 --- a/src/remote/pv/codec.h +++ b/src/remote/pv/codec.h @@ -317,6 +317,7 @@ public: virtual void scheduleSend() OVERRIDE FINAL {} virtual void sendCompleted() OVERRIDE FINAL {} virtual void close() OVERRIDE FINAL; + virtual void waitJoin() OVERRIDE FINAL; virtual bool terminated() OVERRIDE FINAL; virtual bool isOpen() OVERRIDE FINAL; void start(); diff --git a/src/remote/pv/remote.h b/src/remote/pv/remote.h index 8c50c2f..0940bde 100644 --- a/src/remote/pv/remote.h +++ b/src/remote/pv/remote.h @@ -287,6 +287,9 @@ public: */ virtual void close() = 0; + //! Call after close() to wait for any worker threads to exit + virtual void waitJoin() {} + /** * Check connection status. * @return true if connected. diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index 7899399..177ddd8 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -375,6 +375,7 @@ void ServerContextImpl::destroyAllTransports() for (size_t i = 0; i < size; i++) { const Transport::shared_pointer& transport = transports[i]; + transport->waitJoin(); if(!transport.unique()) LOG(logLevelError, "Closed transport %s still has use_count=%u", transport->getRemoteName().c_str(),