This is an automated email from the ASF dual-hosted git repository.
duke8253 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new a27e58c destroy threads after job done (#7083)
a27e58c is described below
commit a27e58c26c653546ca33598809f22d89b86db33b
Author: Fei Deng <[email protected]>
AuthorDate: Fri Aug 7 10:53:34 2020 -0500
destroy threads after job done (#7083)
---
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 897cef1..e3c9bac 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<void()> const &cb)
+ProcessManager::start(std::function<TSThread()> const &cb_init,
std::function<void(TSThread)> 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 fdf555d..c19b14c 100644
--- a/mgmt/ProcessManager.h
+++ b/mgmt/ProcessManager.h
@@ -28,6 +28,8 @@
#include <functional>
#include <string_view>
+#include <ts/apidefs.h>
+
#include "MgmtUtils.h"
#include "BaseManager.h"
#include "tscore/ink_sock.h"
@@ -49,7 +51,8 @@ public:
// 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<void()> const &cb = std::function<void()>());
+ void start(std::function<TSThread()> const &cb_init =
std::function<TSThread()>(),
+ std::function<void(TSThread)> const &cb_destroy =
std::function<void(TSThread)>());
// Stop the process manager, dropping any unprocessed messages.
void stop();
@@ -94,7 +97,9 @@ private:
/// Thread initialization callback.
/// This allows @c traffic_server and @c traffic_manager to perform
different initialization in the thread.
- std::function<void()> init;
+ std::function<TSThread()> init;
+ std::function<void(TSThread)> 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 80ba310..c86fd0d 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();