of dynamic lock support in the nCipher code.
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;
}
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)
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,
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))
{
if (pointer)
{
- dynlock_locking_callback(mode, pointer, file, line);
+ dynlock_lock_callback(mode, pointer, file, line);
}
CRYPTO_destroy_dynlockid(i);
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 */
/* struct CRYPTO_dynlock_value needs to be defined by the user */
- typedef struct CRYPTO_dynlock_value CRYPTO_dynlock;
+ struct CRYPTO_dynlock_value;
- void CRYPTO_set_dynlock_create_callback(CRYPTO_dynlock *(*dyn_create_function)
- (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, CRYPTO_dynlock *l, const char *file, int line));
+ (int mode, struct CRYPTO_dynlock_value *l,
+ const char *file, int line));
void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)
- (CRYPTO_dynlock *l, const char *file, int line));
+ (struct CRYPTO_dynlock_value *l, const char *file, int line));
int CRYPTO_get_new_dynlockid(void);
// no thread support
#endif
+Also, dynamic locks are currently not used internally by OpenSSL, but
+may do so in the future.
+
=head1 EXAMPLES
B<crypto/threads/mttest.c> shows examples of the callback functions on
CRYPTO_set_dynlock_size 2414
CRYPTO_set_dynlock_create_callback 2415
CRYPTO_set_dynlock_lock_callback 2416
+CRYPTO_get_dynlock_lock_callback 2417
+CRYPTO_get_dynlock_destroy_callback 2418
+CRYPTO_get_dynlock_value 2419
+CRYPTO_get_dynlock_create_callback 2420
+ERR_load_ENGINE_strings 2421
+ENGINE_set_DSA 2422
+ENGINE_get_default_RSA 2423
+ENGINE_get_BN_mod_exp 2424
+DSA_get_default_openssl_method 2425
+ENGINE_set_DH 2426
+ENGINE_set_default_BN_mod_exp_crt 2427
+ENGINE_init 2428
+DH_get_default_openssl_method 2429
+RSA_set_default_openssl_method 2430
+ENGINE_finish 2431
+ENGINE_get_DH 2432
+ENGINE_set_default_DSA 2433
+ENGINE_get_name 2434
+ENGINE_get_last 2435
+ENGINE_get_prev 2436
+ENGINE_get_default_DH 2437
+ENGINE_get_RSA 2438
+ENGINE_set_default 2439
+ENGINE_get_RAND 2440
+ENGINE_get_first 2441
+ENGINE_by_id 2442
+ENGINE_get_default_BN_mod_exp_crt 2443
+RSA_get_default_openssl_method 2444
+ENGINE_set_RSA 2445
+ENGINE_set_default_RAND 2446
+ENGINE_set_BN_mod_exp 2447
+ENGINE_remove 2448
+ENGINE_free 2449
+ENGINE_get_BN_mod_exp_crt 2450
+ENGINE_get_next 2451
+ENGINE_set_name 2452
+ENGINE_get_default_DSA 2453
+ENGINE_set_default_BN_mod_exp 2454
+ENGINE_set_default_RSA 2455
+ENGINE_get_default_RAND 2456
+ENGINE_get_default_BN_mod_exp 2457
+ENGINE_set_RAND 2458
+ENGINE_set_id 2459
+ENGINE_set_BN_mod_exp_crt 2460
+ENGINE_set_default_DH 2461
+ENGINE_new 2462
+ENGINE_get_id 2463
+DSA_set_default_openssl_method 2464
+ENGINE_add 2465
+DH_set_default_openssl_method 2466
+ENGINE_get_DSA 2467