|
@@ -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
|