diff options
Diffstat (limited to 'librabbitmq/amqp-openssl.c')
-rw-r--r-- | librabbitmq/amqp-openssl.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/librabbitmq/amqp-openssl.c b/librabbitmq/amqp-openssl.c index 965f6e1..35f908c 100644 --- a/librabbitmq/amqp-openssl.c +++ b/librabbitmq/amqp-openssl.c @@ -45,7 +45,12 @@ static amqp_boolean_t openssl_initialized = 0; static unsigned long amqp_ssl_threadid_callback(void); static void amqp_ssl_locking_callback(int mode, int n, const char *file, int line); +#ifdef _WIN32 +static long win32_create_mutex = 0; +static pthread_mutex_t openssl_init_mutex = NULL; +#else static pthread_mutex_t openssl_init_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif static pthread_mutex_t *amqp_openssl_lockarray = NULL; #endif /* ENABLE_THREAD_SAFETY */ @@ -323,6 +328,22 @@ amqp_ssl_locking_callback(int mode, int n, const char *file, int line) static int initialize_openssl() { +#ifdef _WIN32 + /* No such thing as PTHREAD_INITIALIZE_MUTEX macro on Win32, so we use this */ + if (NULL == openssl_init_mutex) + { + while (InterlockedExchange(&win32_create_mutex, 1) == 1) + /* Loop, someone else is holding this lock */ ; + + if (NULL == openssl_init_mutex) + { + if (pthread_mutex_init(&openssl_init_mutex, NULL)) + return -1; + } + InterlockedExchange(&win32_create_mutex, 0); + } +#endif /* _WIN32 */ + #ifdef ENABLE_THREAD_SAFETY if (pthread_mutex_lock(&openssl_init_mutex)) return -1; @@ -339,7 +360,7 @@ initialize_openssl() pthread_mutex_unlock(&openssl_init_mutex); return -1; } - for (int i = 0; i < CRYPTO_num_locks(); ++i) + for (i = 0; i < CRYPTO_num_locks(); ++i) { if (pthread_mutex_init(&amqp_openssl_lockarray[i], NULL)) { |