diff --git a/src/cluster/backend/zeromq/ZeroMQ.cc b/src/cluster/backend/zeromq/ZeroMQ.cc index ee1ec4df89..99207e82f5 100644 --- a/src/cluster/backend/zeromq/ZeroMQ.cc +++ b/src/cluster/backend/zeromq/ZeroMQ.cc @@ -66,6 +66,16 @@ ZeroMQBackend::ZeroMQBackend(std::unique_ptr es, std::unique_pt main_inproc = zmq::socket_t(ctx, zmq::socket_type::pair); } +ZeroMQBackend::~ZeroMQBackend() { + try { + // DoTerminate is idempotent. + DoTerminate(); + } catch ( ... ) { + // This should never happen. + abort(); + } +} + void ZeroMQBackend::DoInitPostScript() { ThreadedBackend::DoInitPostScript(); @@ -109,6 +119,7 @@ void ZeroMQBackend::DoTerminate() { if ( proxy_thread ) { ZEROMQ_DEBUG("Shutting down proxy thread"); proxy_thread->Shutdown(); + proxy_thread.reset(); } ZEROMQ_DEBUG("Terminated"); diff --git a/src/cluster/backend/zeromq/ZeroMQ.h b/src/cluster/backend/zeromq/ZeroMQ.h index 6959fcb59e..3a6783ff5c 100644 --- a/src/cluster/backend/zeromq/ZeroMQ.h +++ b/src/cluster/backend/zeromq/ZeroMQ.h @@ -20,6 +20,11 @@ public: ZeroMQBackend(std::unique_ptr es, std::unique_ptr ls, std::unique_ptr ehs); + /** + * Destructor. + */ + ~ZeroMQBackend(); + /** * Spawns a thread running zmq_proxy() for the configured XPUB/XSUB listen * sockets. Only one node in a cluster should do this.