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 841b9c6  use pthread_cancel
841b9c6 is described below

commit 841b9c699a779cc5528c6861aacf29f229f290db
Author: Fei Deng <[email protected]>
AuthorDate: Mon Mar 18 16:45:42 2019 -0500

    use pthread_cancel
---
 .../ssl_session_reuse/src/ats_ssl_plugin.cc        | 15 ++++++++++
 .../experimental/ssl_session_reuse/src/publish.cc  |  5 ++++
 .../ssl_session_reuse/src/ssl_key_utils.cc         |  8 ++++++
 .../experimental/ssl_session_reuse/src/ssl_utils.h | 33 ++++++++++++++++++++++
 .../ssl_session_reuse/src/subscriber.cc            |  4 +++
 5 files changed, 65 insertions(+)

diff --git a/plugins/experimental/ssl_session_reuse/src/ats_ssl_plugin.cc 
b/plugins/experimental/ssl_session_reuse/src/ats_ssl_plugin.cc
index 9977657..1a8e171 100644
--- a/plugins/experimental/ssl_session_reuse/src/ats_ssl_plugin.cc
+++ b/plugins/experimental/ssl_session_reuse/src/ats_ssl_plugin.cc
@@ -28,7 +28,20 @@
 #include <openssl/ssl.h>
 
 #include "ssl_utils.h"
+
+PluginThreads plugin_threads;
+
 int SSL_session_callback(TSCont contp, TSEvent event, void *edata);
+
+static int
+shutdown_handler(TSCont contp, TSEvent event, void *edata)
+{
+  if ((event == TS_EVENT_LIFECYCLE_SHUTDOWN)) {
+    plugin_threads.terminate();
+  }
+  return 0;
+}
+
 void
 TSPluginInit(int argc, const char *argv[])
 {
@@ -38,6 +51,8 @@ TSPluginInit(int argc, const char *argv[])
   info.vendor_name   = (char *)("ats");
   info.support_email = (char *)("[email protected]");
 
+  TSLifecycleHookAdd(TS_LIFECYCLE_SHUTDOWN_HOOK, 
TSContCreate(shutdown_handler, nullptr));
+
 #if (TS_VERSION_NUMBER >= 7000000)
   if (TSPluginRegister(&info) != TS_SUCCESS) {
     TSError("Plugin registration failed.");
diff --git a/plugins/experimental/ssl_session_reuse/src/publish.cc 
b/plugins/experimental/ssl_session_reuse/src/publish.cc
index d4df648..a74664c 100644
--- a/plugins/experimental/ssl_session_reuse/src/publish.cc
+++ b/plugins/experimental/ssl_session_reuse/src/publish.cc
@@ -33,10 +33,15 @@
 #include "publisher.h"
 #include "Config.h"
 #include "redis_auth.h"
+#include "ssl_utils.h"
 
 void *
 RedisPublisher::start_worker_thread(void *arg)
 {
+  plugin_threads.store(::pthread_self());
+  ::pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
+  ::pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
+
   RedisPublisher *publisher = static_cast<RedisPublisher *>(arg);
   publisher->runWorker();
   return arg;
diff --git a/plugins/experimental/ssl_session_reuse/src/ssl_key_utils.cc 
b/plugins/experimental/ssl_session_reuse/src/ssl_key_utils.cc
index 90e61d8..323fe07 100644
--- a/plugins/experimental/ssl_session_reuse/src/ssl_key_utils.cc
+++ b/plugins/experimental/ssl_session_reuse/src/ssl_key_utils.cc
@@ -284,6 +284,10 @@ STEK_Send_To_Network(struct ssl_ticket_key_t *stekToSend)
 static void *
 STEK_Update_Setter_Thread(void *arg)
 {
+  plugin_threads.store(::pthread_self());
+  ::pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
+  ::pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
+
   int sleepInterval;
   struct ssl_ticket_key_t newKey;
   int startProblem = 0; // counter for start up and retry issues.
@@ -368,6 +372,10 @@ STEK_update(const std::string &encrypted_stek)
 static void *
 STEK_Update_Checker_Thread(void *arg)
 {
+  plugin_threads.store(::pthread_self());
+  ::pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
+  ::pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
+
   time_t currentTime;
   time_t lastWarningTime; // last time we put out a warning
 
diff --git a/plugins/experimental/ssl_session_reuse/src/ssl_utils.h 
b/plugins/experimental/ssl_session_reuse/src/ssl_utils.h
index 5711ff8..bbfbf0c 100644
--- a/plugins/experimental/ssl_session_reuse/src/ssl_utils.h
+++ b/plugins/experimental/ssl_session_reuse/src/ssl_utils.h
@@ -26,6 +26,8 @@
 #include <openssl/ssl.h>
 #include <string>
 #include <ts/ts.h>
+#include <mutex>
+#include <deque>
 
 #include "publisher.h"
 #include "subscriber.h"
@@ -45,6 +47,35 @@ struct ssl_session_param {
   ~ssl_session_param();
 };
 
+class PluginThreads
+{
+public:
+  void
+  store(const pthread_t &th)
+  {
+    std::lock_guard<std::mutex> lock(threads_mutex);
+    threads_queue.push_back(th);
+  }
+
+  void
+  terminate()
+  {
+    std::lock_guard<std::mutex> lock(threads_mutex);
+    for (pthread_t th : threads_queue) {
+      ::pthread_cancel(th);
+    }
+    while (!threads_queue.empty()) {
+      pthread_t th = threads_queue.front();
+      ::pthread_join(th, nullptr);
+      threads_queue.pop_front();
+    }
+  }
+
+private:
+  std::deque<pthread_t> threads_queue;
+  std::mutex threads_mutex;
+};
+
 int STEK_init_keys();
 
 const char *get_key_ptr();
@@ -66,3 +97,5 @@ int init_subscriber();
 int SSL_session_callback(TSCont contp, TSEvent event, void *edata);
 
 extern ssl_session_param ssl_param; // almost everything one needs is stored 
in here
+
+extern PluginThreads plugin_threads;
diff --git a/plugins/experimental/ssl_session_reuse/src/subscriber.cc 
b/plugins/experimental/ssl_session_reuse/src/subscriber.cc
index 5df7855..7dfc556 100644
--- a/plugins/experimental/ssl_session_reuse/src/subscriber.cc
+++ b/plugins/experimental/ssl_session_reuse/src/subscriber.cc
@@ -39,6 +39,10 @@
 void *
 setup_subscriber(void *arg)
 {
+  plugin_threads.store(::pthread_self());
+  ::pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
+  ::pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
+
   RedisSubscriber *me = static_cast<RedisSubscriber *>(arg);
   me->run();
   return (void *)1;

Reply via email to