summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-25 06:32:23 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-25 06:32:23 (GMT)
commitf9c2adf3109a8e0a1ae5c4125e695cc9d1f9722d (patch)
treecebfbf9962810e1dd83f864a639bf6d172714232 /random.c
parent2c3656f5e8c14f2e88e2100eb5e9911b58f94d37 (diff)
random.c: refactor
* random.c (fill_random_bytes): separate non-raced and raced conditions, on Windows. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51024 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r--random.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/random.c b/random.c
index dc90af4..344798a 100644
--- a/random.c
+++ b/random.c
@@ -486,17 +486,16 @@ fill_random_bytes(void *seed, size_t size)
prov = (HCRYPTPROV)INVALID_HANDLE_VALUE;
}
old_prov = (HCRYPTPROV)ATOMIC_PTR_CAS(perm_prov, 0, prov);
- if (prov == (HCRYPTPROV)INVALID_HANDLE_VALUE) {
- if (old_prov) prov = old_prov;
- }
- else {
- if (!old_prov) {
+ if (LIKELY(!old_prov)) { /* no other threads acquried */
+ if (prov != (HCRYPTPROV)INVALID_HANDLE_VALUE) {
rb_gc_register_mark_object(Data_Wrap_Struct(0, 0, release_crypt, &perm_prov));
}
- else {
+ }
+ else { /* another thread acquried */
+ if (prov != (HCRYPTPROV)INVALID_HANDLE_VALUE) {
CryptReleaseContext(prov, 0);
- prov = old_prov;
}
+ prov = old_prov;
}
}
if (prov == (HCRYPTPROV)INVALID_HANDLE_VALUE) return -1;