+int CRYPTO_num_locks(void)
+ {
+ return CRYPTO_NUM_LOCKS;
+ }
+
+int CRYPTO_get_new_dynlockid(void)
+ {
+ int i = 0;
+ CRYPTO_dynlock *pointer = NULL;
+
+ if (dynlock_create_callback == NULL)
+ {
+ CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK);
+ return(0);
+ }
+ if ((dyn_locks == NULL)
+ && ((dyn_locks=sk_new_null()) == NULL))
+ {
+ CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE);
+ return(0);
+ }
+
+ pointer = dynlock_create_callback(__FILE__,__LINE__);
+ if (pointer == NULL)
+ {
+ CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE);
+ return(0);
+ }
+ i=sk_CRYPTO_dynlock_push(dyn_locks,pointer);
+ if (!i)
+ dynlock_destroy_callback(pointer,__FILE__,__LINE__);
+ else
+ i += 1; /* to avoid 0 */
+ return -i;
+ }
+
+void CRYPTO_destroy_dynlockid(int i)
+ {
+ if (i)
+ i = -i-1;
+ if (dyn_locks == NULL || i >= sk_CRYPTO_dynlock_num(dyn_locks))
+ return;
+ if (dynlock_destroy_callback == NULL)
+ return;
+ dynlock_destroy_callback(sk_CRYPTO_dynlock_value(dyn_locks, i),
+ __FILE__,__LINE__);
+ sk_CRYPTO_dynlock_set(dyn_locks, i, NULL);
+ }
+
+CRYPTO_dynlock *CRYPTO_get_dynlock_value(int i)
+ {
+ if (i)
+ i = -i-1;
+ if (dyn_locks == NULL || i >= sk_CRYPTO_dynlock_num(dyn_locks))
+ return NULL;
+ return sk_CRYPTO_dynlock_value(dyn_locks, i);
+ }
+
+void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file,
+ int line)