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;