From f9c2adf3109a8e0a1ae5c4125e695cc9d1f9722d Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 25 Jun 2015 06:32:23 +0000 Subject: [PATCH] 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 --- random.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/random.c b/random.c index dc90af4f5a..344798aea4 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;