diff options
author | Bodo Möller <bodo@openssl.org> | 2006-06-23 15:21:36 +0000 |
---|---|---|
committer | Bodo Möller <bodo@openssl.org> | 2006-06-23 15:21:36 +0000 |
commit | 48fc582f66a58e3da6f095ba1b4498c17581e05a (patch) | |
tree | 8750d220a6755e61e7b064e4cfdf180feaf04bd7 /crypto/rand/md_rand.c | |
parent | 81de1028bc8e2384af5e3f50fdad2e72f8cfc4f8 (diff) |
New functions CRYPTO_set_idptr_callback(),
CRYPTO_get_idptr_callback(), CRYPTO_thread_idptr() for a 'void *' type
thread ID, since the 'unsigned long' type of the existing thread ID
does not always work well.
Diffstat (limited to 'crypto/rand/md_rand.c')
-rw-r--r-- | crypto/rand/md_rand.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/crypto/rand/md_rand.c b/crypto/rand/md_rand.c index 6e10f6ef67..4aa13f7156 100644 --- a/crypto/rand/md_rand.c +++ b/crypto/rand/md_rand.c @@ -145,7 +145,8 @@ static unsigned int crypto_lock_rand = 0; /* may be set only when a thread * holds CRYPTO_LOCK_RAND * (to prevent double locking) */ /* access to lockin_thread is synchronized by CRYPTO_LOCK_RAND2 */ -static unsigned long locking_thread = 0; /* valid iff crypto_lock_rand is set */ +static unsigned long locking_thread_id = 0; /* valid iff crypto_lock_rand is set */ +static void *locking_thread_idptr = NULL; /* valid iff crypto_lock_rand is set */ #ifdef PREDICT @@ -214,7 +215,7 @@ static void ssleay_rand_add(const void *buf, int num, double add) if (crypto_lock_rand) { CRYPTO_r_lock(CRYPTO_LOCK_RAND2); - do_not_lock = (locking_thread == CRYPTO_thread_id()); + do_not_lock = (locking_thread_id == CRYPTO_thread_id()) && (locking_thread_idptr == CRYPTO_thread_idptr()); CRYPTO_r_unlock(CRYPTO_LOCK_RAND2); } else @@ -372,7 +373,8 @@ static int ssleay_rand_bytes(unsigned char *buf, int num) /* prevent ssleay_rand_bytes() from trying to obtain the lock again */ CRYPTO_w_lock(CRYPTO_LOCK_RAND2); - locking_thread = CRYPTO_thread_id(); + locking_thread_id = CRYPTO_thread_id(); + locking_thread_idptr = CRYPTO_thread_idptr(); CRYPTO_w_unlock(CRYPTO_LOCK_RAND2); crypto_lock_rand = 1; @@ -535,7 +537,7 @@ static int ssleay_rand_status(void) if (crypto_lock_rand) { CRYPTO_r_lock(CRYPTO_LOCK_RAND2); - do_not_lock = (locking_thread == CRYPTO_thread_id()); + do_not_lock = (locking_thread_id == CRYPTO_thread_id()) && (locking_thread_idptr == CRYPTO_thread_idptr()); CRYPTO_r_unlock(CRYPTO_LOCK_RAND2); } else @@ -547,7 +549,8 @@ static int ssleay_rand_status(void) /* prevent ssleay_rand_bytes() from trying to obtain the lock again */ CRYPTO_w_lock(CRYPTO_LOCK_RAND2); - locking_thread = CRYPTO_thread_id(); + locking_thread_id = CRYPTO_thread_id(); + locking_thread_idptr = CRYPTO_thread_idptr(); CRYPTO_w_unlock(CRYPTO_LOCK_RAND2); crypto_lock_rand = 1; } |