From d3b5b24b4321c78375e8fa2d69567f711fc65afc Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 15 Sep 2015 20:39:05 +0200 Subject: [PATCH] Use unsigned long variable from thread local storage as SSL thread ID. See discussion in #200 --- src/civetweb.c | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/src/civetweb.c b/src/civetweb.c index 91d6b98f..049e6247 100755 --- a/src/civetweb.c +++ b/src/civetweb.c @@ -486,12 +486,10 @@ static int pthread_setspecific(pthread_key_t key, void *value) return TlsSetValue(key, value) ? 0 : 1; } -#ifdef ENABLE_UNUSED_PTHREAD_FUNCTIONS static void *pthread_getspecific(pthread_key_t key) { return TlsGetValue(key); } -#endif #if defined(__MINGW32__) /* Enable unused function warning again */ @@ -1149,9 +1147,11 @@ struct mg_connection { static pthread_key_t sTlsKey; /* Thread local storage index */ static int sTlsInit = 0; +static int thread_idx_max = 0; struct mg_workerTLS { int is_master; + unsigned long thread_idx; #if defined(_WIN32) && !defined(__SYMBIAN32__) HANDLE pthread_cond_helper_mutex; #endif @@ -2317,7 +2317,8 @@ static int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mutex, const struct timespec *abstime) { - struct mg_workerTLS *tls = (struct mg_workerTLS *)TlsGetValue(sTlsKey); + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); int ok; struct timespec tsnow; int64_t nsnow, nswaitabs, nswaitrel; @@ -9631,32 +9632,16 @@ ssl_locking_callback(int mode, int mutex_num, const char *file, int line) } -#ifndef pthread_t_LARGER_THAN_unsigned_long /* Must be set if sizeof(pthread_t) > sizeof(unsigned long) */ static unsigned long ssl_id_callback(void) { -#if defined _WIN32 - /* Win32 thread IDs are DWORDs */ - return (unsigned long)GetCurrentThreadId(); -#else - /* CRYPTO_set_id_callback() assumes thread IDs can be represented by - * unsigned long. See - * https://www.openssl.org/docs/manmaster/crypto/threads.html#HISTORY */ - - /* TODO(high): Deal with sizeof(pthread_t) > sizeof(unsigned long) in - * another way. Using the new openSSL API would cause an in incompatibility - * with systems running the old SSL library. Maybe the entire function is - * not required at all, since the default function will work? - - mg_static_assert(sizeof(pthread_t) <= sizeof(unsigned long), - "Thread-ID data type size check" - " - set pthread_t_LARGER_THAN_unsigned_long"); - */ - - return (unsigned long)pthread_self(); -#endif + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); + if (tls == NULL) { + return 0; + } + return tls->thread_idx; } -#endif #if !defined(NO_SSL_DL) @@ -9751,11 +9736,7 @@ static int initialize_ssl(struct mg_context *ctx) } CRYPTO_set_locking_callback(&ssl_locking_callback); - -#ifndef pthread_t_LARGER_THAN_unsigned_long - /* Cannot use this function if sizeof(pthread_t) > sizeof(unsigned long) */ CRYPTO_set_id_callback(&ssl_id_callback); -#endif return 1; } @@ -10794,6 +10775,7 @@ static void *worker_thread_run(void *thread_func_param) mg_set_thread_name("worker"); tls.is_master = 0; + tls.thread_idx = (unsigned)mg_atomic_inc(&thread_idx_max); #if defined(_WIN32) && !defined(__SYMBIAN32__) tls.pthread_cond_helper_mutex = CreateEvent(NULL, FALSE, FALSE, NULL); #endif