mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
2c3656f5e8
commit
f9c2adf310
1 changed files with 6 additions and 7 deletions
13
random.c
13
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;
|
||||
|
|
Loading…
Reference in a new issue