diff options
author | Mark Janes <[email protected]> | 2016-04-12 11:52:53 -0700 |
---|---|---|
committer | Mark Janes <[email protected]> | 2016-04-15 10:24:40 -0700 |
commit | ade3108bb5b074013417b31e61b8077ccefb7484 (patch) | |
tree | 822a94d66857161e55a6eabd07188b356bf53b89 /src/util/mesa-sha1.c | |
parent | 2d5bd66e4f5ba15464c1e915a259d2442e88f736 (diff) |
util: Fix race condition on libgcrypt initialization
Fixes intermittent Vulkan CTS failures within the test groups:
dEQP-VK.api.object_management.multithreaded_per_thread_device
dEQP-VK.api.object_management.multithreaded_per_thread_resources
dEQP-VK.api.object_management.multithreaded_shared_resources
Signed-off-by: Mark Janes <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94904
Reviewed-by: Edward O'Callaghan <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/util/mesa-sha1.c')
-rw-r--r-- | src/util/mesa-sha1.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/util/mesa-sha1.c b/src/util/mesa-sha1.c index faa1c871b5d..ca6b89bb2c7 100644 --- a/src/util/mesa-sha1.c +++ b/src/util/mesa-sha1.c @@ -175,21 +175,24 @@ _mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) #elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */ #include <gcrypt.h> +#include "c11/threads.h" + +static void _mesa_libgcrypt_init(void) +{ + if (!gcry_check_version(NULL)) + return NULL; + gcry_control(GCRYCTL_DISABLE_SECMEM, 0); + gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); +} struct mesa_sha1 * _mesa_sha1_init(void) { - static int init; + static once_flag flag = ONCE_FLAG_INIT; gcry_md_hd_t h; gcry_error_t err; - if (!init) { - if (!gcry_check_version(NULL)) - return NULL; - gcry_control(GCRYCTL_DISABLE_SECMEM, 0); - gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); - init = 1; - } + call_once(&flag, _mesa_libgcrypt_init); err = gcry_md_open(&h, GCRY_MD_SHA1, 0); if (err) |