diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-25 06:32:23 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-25 06:32:23 +0000 |
commit | f9c2adf3109a8e0a1ae5c4125e695cc9d1f9722d (patch) | |
tree | cebfbf9962810e1dd83f864a639bf6d172714232 /random.c | |
parent | 2c3656f5e8c14f2e88e2100eb5e9911b58f94d37 (diff) | |
download | ruby-f9c2adf3109a8e0a1ae5c4125e695cc9d1f9722d.tar.gz |
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.c | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -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; |