Add the missing callback pointer handling functions.
authorRichard Levitte <levitte@openssl.org>
Mon, 19 Jun 2000 16:38:27 +0000 (16:38 +0000)
committerRichard Levitte <levitte@openssl.org>
Mon, 19 Jun 2000 16:38:27 +0000 (16:38 +0000)
Also, make sure empty slots of the dynamic lock stack are used.
Actually, I'm not really sure this is the right thing to do, and may
remove it, with an endlessly growing stack as result...

crypto/cryptlib.c
crypto/crypto.h

index f5e4431..cf291b4 100644 (file)
@@ -122,7 +122,7 @@ static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
 static unsigned long (MS_FAR *id_callback)(void)=NULL;
 static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback)
        (const char *file,int line)=NULL;
-static void (MS_FAR *dynlock_locking_callback)(int mode,
+static void (MS_FAR *dynlock_lock_callback)(int mode,
        struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL;
 static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l,
        const char *file,int line)=NULL;
@@ -199,7 +199,11 @@ int CRYPTO_get_new_dynlockid(void)
                }
 
        CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK);
-       i=sk_CRYPTO_dynlock_push(dyn_locks,pointer);
+       /* First, try to find an existing empty slot */
+       i=sk_CRYPTO_dynlock_find(dyn_locks,NULL);
+       /* If there was none, push, thereby creating a new one */
+       if (i == -1)
+               i=sk_CRYPTO_dynlock_push(dyn_locks,pointer);
        CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK);
 
        if (!i)
@@ -272,16 +276,47 @@ struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i)
        return NULL;
        }
 
-void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file,
-               int line)
+struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))
+       (const char *file,int line)
        {
-       return(locking_callback);
+       return(dynlock_create_callback);
        }
 
 void (*CRYPTO_get_dynlock_lock_callback(void))(int mode,
        struct CRYPTO_dynlock_value *l, const char *file,int line)
        {
-       return(dynlock_locking_callback);
+       return(dynlock_lock_callback);
+       }
+
+void (*CRYPTO_get_dynlock_destroy_callback(void))
+       (struct CRYPTO_dynlock_value *l, const char *file,int line)
+       {
+       return(dynlock_destroy_callback);
+       }
+
+void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*func)
+       (const char *file, int line))
+       {
+       dynlock_create_callback=func;
+       }
+
+void CRYPTO_set_dynlock_lock_callback(void (*func)(int mode,
+       struct CRYPTO_dynlock_value *l, const char *file, int line))
+       {
+       dynlock_lock_callback=func;
+       }
+
+void CRYPTO_set_dynlock_destroy_callback(void (*func)
+       (struct CRYPTO_dynlock_value *l, const char *file, int line))
+       {
+       dynlock_destroy_callback=func;
+       }
+
+
+void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file,
+               int line)
+       {
+       return(locking_callback);
        }
 
 int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type,
@@ -296,12 +331,6 @@ void CRYPTO_set_locking_callback(void (*func)(int mode,int type,
        locking_callback=func;
        }
 
-void CRYPTO_set_dynlock_locking_callback(void (*func)(int mode,
-       struct CRYPTO_dynlock_value *l, const char *file, int line))
-       {
-       dynlock_locking_callback=func;
-       }
-
 void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type,
                                              const char *file,int line))
        {
@@ -372,7 +401,7 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
 
                if (pointer)
                        {
-                       dynlock_locking_callback(mode, pointer, file, line);
+                       dynlock_lock_callback(mode, pointer, file, line);
                        }
 
                CRYPTO_destroy_dynlockid(i);
index 846be38..bda2f56 100644 (file)
@@ -311,17 +311,16 @@ unsigned long CRYPTO_thread_id(void);
 const char *CRYPTO_get_lock_name(int type);
 int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file,
                    int line);
-void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)
-       (char *file, int line));
-void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)
-       (int mode, struct CRYPTO_dynlock_value *l,
-               const char *file, int line));
-void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)
-       (struct CRYPTO_dynlock_value *l, const char *file, int line));
-void CRYPTO_set_dynlock_size(int dynlock_size);
+
 int CRYPTO_get_new_dynlockid(void);
 void CRYPTO_destroy_dynlockid(int i);
 struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i);
+void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line));
+void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line));
+void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line));
+struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line);
+void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line);
+void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line);
 
 /* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions --
  * call the latter last if you need different functions */