From b71ac44656163756ff57434808ae326be9ee24b2 Mon Sep 17 00:00:00 2001 From: Fei Deng Date: Tue, 4 Aug 2020 12:24:43 -0500 Subject: [PATCH] destroy threads after job done --- mgmt/ProcessManager.cc | 12 +++++++++--- mgmt/ProcessManager.h | 9 +++++++-- src/traffic_server/traffic_server.cc | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/mgmt/ProcessManager.cc b/mgmt/ProcessManager.cc index 897cef1cc70..e3c9baced24 100644 --- a/mgmt/ProcessManager.cc +++ b/mgmt/ProcessManager.cc @@ -82,11 +82,12 @@ read_management_message(int sockfd, MgmtMessageHdr **msg) } void -ProcessManager::start(std::function const &cb) +ProcessManager::start(std::function const &cb_init, std::function const &cb_destroy) { Debug("pmgmt", "starting process manager"); - init = cb; + init = cb_init; + destroy = cb_destroy; ink_release_assert(running == 0); ink_atomic_increment(&running, 1); @@ -153,7 +154,7 @@ ProcessManager::processManagerThread(void *arg) } if (pmgmt->init) { - pmgmt->init(); + pmgmt->managerThread = pmgmt->init(); } // Start pumping messages between the local process and the process @@ -178,6 +179,11 @@ ProcessManager::processManagerThread(void *arg) } } + if (pmgmt->destroy && pmgmt->managerThread != nullptr) { + pmgmt->destroy(pmgmt->managerThread); + pmgmt->managerThread = nullptr; + } + return ret; } diff --git a/mgmt/ProcessManager.h b/mgmt/ProcessManager.h index fdf555da45f..c19b14cd9b1 100644 --- a/mgmt/ProcessManager.h +++ b/mgmt/ProcessManager.h @@ -28,6 +28,8 @@ #include #include +#include + #include "MgmtUtils.h" #include "BaseManager.h" #include "tscore/ink_sock.h" @@ -49,7 +51,8 @@ class ProcessManager : public BaseManager // Start a thread for the process manager. If @a cb is set then it // is called after the thread is started and before any messages are // processed. - void start(std::function const &cb = std::function()); + void start(std::function const &cb_init = std::function(), + std::function const &cb_destroy = std::function()); // Stop the process manager, dropping any unprocessed messages. void stop(); @@ -94,7 +97,9 @@ class ProcessManager : public BaseManager /// Thread initialization callback. /// This allows @c traffic_server and @c traffic_manager to perform different initialization in the thread. - std::function init; + std::function init; + std::function destroy; + TSThread managerThread = nullptr; int local_manager_sockfd; #if HAVE_EVENTFD diff --git a/src/traffic_server/traffic_server.cc b/src/traffic_server/traffic_server.cc index 80ba31071a9..c86fd0dbcd5 100644 --- a/src/traffic_server/traffic_server.cc +++ b/src/traffic_server/traffic_server.cc @@ -662,8 +662,8 @@ initialize_process_manager() pmgmt = new ProcessManager(remote_management_flag); // Lifecycle callbacks can potentially be invoked from this thread, so force thread initialization - // to make the TS API work. Use a lambda to avoid dealing with compiler dependent casting issues. - pmgmt->start([]() -> void { TSThreadInit(); }); + // to make the TS API work. + pmgmt->start(TSThreadInit, TSThreadDestroy); RecProcessInitMessage(remote_management_flag ? RECM_CLIENT : RECM_STAND_ALONE); pmgmt->reconfigure();