summaryrefslogtreecommitdiff
path: root/librabbitmq/amqp-openssl.c
diff options
context:
space:
mode:
Diffstat (limited to 'librabbitmq/amqp-openssl.c')
-rw-r--r--librabbitmq/amqp-openssl.c23
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))
{