[vlc-devel] [PATCH 2/2] rand: only load the random generator algorithm once

Steve Lhomme robux4 at ycbcr.xyz
Thu Mar 26 16:33:37 CET 2020


According to the documentation:
Because of the number and type of operations that are required to find, load,
and initialize an algorithm provider, the BCryptOpenAlgorithmProvider function
is a relatively time intensive function. Because of this, we recommend that you
cache any algorithm provider handles that you will use more than once, rather
than opening and closing the algorithm providers over and over.

We don't release it anymore but it should be released when the process ends.
---
 src/win32/rand.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/win32/rand.c b/src/win32/rand.c
index 1af02aa5984..949ce866dec 100644
--- a/src/win32/rand.c
+++ b/src/win32/rand.c
@@ -27,14 +27,21 @@
 
 #include <bcrypt.h>
 
-void vlc_rand_bytes (void *buf, size_t len)
+static BCRYPT_ALG_HANDLE algo_handle = NULL;
+
+static void InitAlgo(void)
 {
-    BCRYPT_ALG_HANDLE algo_handle;
     NTSTATUS ret = BCryptOpenAlgorithmProvider(&algo_handle, BCRYPT_RNG_ALGORITHM,
                                                MS_PRIMITIVE_PROVIDER, 0);
-    if (BCRYPT_SUCCESS(ret))
-    {
+    if (!BCRYPT_SUCCESS(ret))
+        algo_handle = NULL;
+}
+
+void vlc_rand_bytes (void *buf, size_t len)
+{
+    static vlc_once_t algo_init_once = VLC_STATIC_ONCE;
+    vlc_once( &algo_init_once, InitAlgo );
+
+    if (likely(algo_handle != NULL))
         BCryptGenRandom(algo_handle, buf, len, 0);
-        BCryptCloseAlgorithmProvider(algo_handle, 0);
-    }
 }
-- 
2.17.1



More information about the vlc-devel mailing list