test_mod_mul is useful, let's run it more often.
[openssl.git] / crypto / threads / th-lock.c
index 21293f20f0bdb2c6f283f79cfe3e8891af8b6bd1..553d2218de76ebec8bbf8c4441316a463bb3e804 100644 (file)
 #include <ulocks.h>
 #include <sys/prctl.h>
 #endif
-#include "lhash.h"
-#include "crypto.h"
-#include "buffer.h"
-#include "e_os.h"
-#include "x509.h"
-#include "ssl.h"
-#include "err.h"
-
-#ifndef NOPROTO
-int CRYPTO_thread_setup(void);
+#ifdef PTHREADS
+#include <pthread.h>
+#endif
+#include <openssl/lhash.h>
+#include <openssl/crypto.h>
+#include <openssl/buffer.h>
+#include <openssl/e_os.h>
+#include <openssl/x509.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+void CRYPTO_thread_setup(void);
 void CRYPTO_thread_cleanup(void);
 
 static void irix_locking_callback(int mode,int type,char *file,int line);
@@ -95,24 +97,9 @@ static unsigned long irix_thread_id(void );
 static unsigned long solaris_thread_id(void );
 static unsigned long pthreads_thread_id(void );
 
-#else
-int CRYPOTO_thread_setup();
-void CRYPTO_cleanup();
-
-static void irix_locking_callback();
-static void solaris_locking_callback();
-static void win32_locking_callback();
-static void pthreads_locking_callback();
-
-static unsigned long irix_thread_id();
-static unsigned long solaris_thread_id();
-static unsigned long pthreads_thread_id();
-
-#endif
-
 /* usage:
  * CRYPTO_thread_setup();
- * applicaion code
+ * application code
  * CRYPTO_thread_cleanup();
  */
 
@@ -120,13 +107,14 @@ static unsigned long pthreads_thread_id();
 
 #ifdef WIN32
 
-static HANDLE lock_cs[CRYPTO_NUM_LOCKS];
+static HANDLE *lock_cs;
 
-int CRYPTO_thread_setup(void)
+void CRYPTO_thread_setup(void)
        {
        int i;
 
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
                }
@@ -141,8 +129,9 @@ static void CRYPTO_thread_cleanup(void)
        int i;
 
        CRYPTO_set_locking_callback(NULL);
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       for (i=0; i<CRYPTO_num_locks(); i++)
                CloseHandle(lock_cs[i]);
+       OPENSSL_free(lock_cs);
        }
 
 void win32_locking_callback(int mode, int type, char *file, int line)
@@ -163,18 +152,24 @@ void win32_locking_callback(int mode, int type, char *file, int line)
 
 #define USE_MUTEX
 
-static mutex_t lock_cs[CRYPTO_NUM_LOCKS];
 #ifdef USE_MUTEX
-static long lock_count[CRYPTO_NUM_LOCKS];
+static mutex_t *lock_cs;
 #else
-static rwlock_t lock_cs[CRYPTO_NUM_LOCKS];
+static rwlock_t *lock_cs;
 #endif
+static long *lock_count;
 
 void CRYPTO_thread_setup(void)
        {
        int i;
 
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+#ifdef USE_MUTEX
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(mutex_t));
+#else
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(rwlock_t));
+#endif
+       lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_count[i]=0;
 #ifdef USE_MUTEX
@@ -193,7 +188,7 @@ void CRYPTO_thread_cleanup(void)
        int i;
 
        CRYPTO_set_locking_callback(NULL);
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
 #ifdef USE_MUTEX
                mutex_destroy(&(lock_cs[i]));
@@ -201,6 +196,8 @@ void CRYPTO_thread_cleanup(void)
                rwlock_destroy(&(lock_cs[i]));
 #endif
                }
+       OPENSSL_free(lock_cs);
+       OPENSSL_free(lock_count);
        }
 
 void solaris_locking_callback(int mode, int type, char *file, int line)
@@ -253,7 +250,7 @@ unsigned long solaris_thread_id(void)
 /* I don't think this works..... */
 
 static usptr_t *arena;
-static usema_t *lock_cs[CRYPTO_NUM_LOCKS];
+static usema_t **lock_cs;
 
 void CRYPTO_thread_setup(void)
        {
@@ -270,7 +267,8 @@ void CRYPTO_thread_setup(void)
        arena=usinit(filename);
        unlink(filename);
 
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(usema_t *));
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_cs[i]=usnewsema(arena,1);
                }
@@ -284,7 +282,7 @@ void CRYPTO_thread_cleanup(void)
        int i;
 
        CRYPTO_set_locking_callback(NULL);
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                char buf[10];
 
@@ -292,6 +290,7 @@ void CRYPTO_thread_cleanup(void)
                usdumpsema(lock_cs[i],stdout,buf);
                usfreesema(lock_cs[i],arena);
                }
+       OPENSSL_free(lock_cs);
        }
 
 void irix_locking_callback(int mode, int type, char *file, int line)
@@ -318,14 +317,16 @@ unsigned long irix_thread_id(void)
 /* Linux and a few others */
 #ifdef PTHREADS
 
-static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS];
-static long lock_count[CRYPTO_NUM_LOCKS];
+static pthread_mutex_t *lock_cs;
+static long *lock_count;
 
 void CRYPTO_thread_setup(void)
        {
        int i;
 
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+       lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_count[i]=0;
                pthread_mutex_init(&(lock_cs[i]),NULL);
@@ -340,10 +341,12 @@ void thread_cleanup(void)
        int i;
 
        CRYPTO_set_locking_callback(NULL);
-       for (i=0; i<CRYPTO_NUM_LOCKS; i++)
+       for (i=0; i<CRYPTO_num_locks(); i++)
                {
                pthread_mutex_destroy(&(lock_cs[i]));
                }
+       OPENSSL_free(lock_cs);
+       OPENSSL_free(lock_count);
        }
 
 void pthreads_locking_callback(int mode, int type, char *file,