diff --git a/src/cluster/Backend.cc b/src/cluster/Backend.cc index 675fcd7982..575d0aeaf7 100644 --- a/src/cluster/Backend.cc +++ b/src/cluster/Backend.cc @@ -203,6 +203,7 @@ bool ThreadedBackend::DoInit() { void ThreadedBackend::DoTerminate() { if ( onloop ) { + onloop->Process(); onloop->Close(); onloop = nullptr; } diff --git a/src/cluster/Backend.h b/src/cluster/Backend.h index 8c40e29703..1b09fb4c88 100644 --- a/src/cluster/Backend.h +++ b/src/cluster/Backend.h @@ -564,7 +564,8 @@ protected: /** * To be used by implementations to enqueue messages for processing on the IO loop. * - * It's safe to call this method from any thread. + * It's safe to call this method from any thread before ThreadedBackend's + * DoTerminate() implementation is invoked. * * @param messages Messages to be enqueued. */ @@ -582,6 +583,17 @@ protected: */ bool DoInit() override; + /** + * Common DoTerminate() functionality for threaded backends. + * + * The default DoTerminate() implementation of ThreadedBackend + * runs OnLoop's Process() once to drain any pending messages, then + * closes and unsets it. + * + * Classes deriving from ThreadedBackend need to ensure that all threads + * calling QeueuForProcessing() have terminated before invoking the + * ThreadedBackend's DoTerminate() implementation. + */ void DoTerminate() override; private: