diff options
Diffstat (limited to 'lib/random.c')
-rw-r--r-- | lib/random.c | 41 |
1 files changed, 9 insertions, 32 deletions
diff --git a/lib/random.c b/lib/random.c index ba7333dc85..73fb143d7f 100644 --- a/lib/random.c +++ b/lib/random.c @@ -29,57 +29,34 @@ #include "locks.h" #include <fips.h> -void *gnutls_rnd_ctx; -GNUTLS_STATIC_MUTEX(gnutls_rnd_init_mutex); +#ifdef HAVE_THREADS_H +# include <threads.h> +#elif defined(__GNUC__) +# define _Thread_local __thread +#else +# error Unsupported platform +#endif -#ifdef HAVE_STDATOMIC_H -static atomic_uint rnd_initialized = 0; +static _Thread_local void *gnutls_rnd_ctx; -inline static int _gnutls_rnd_init(void) -{ - if (unlikely(!rnd_initialized)) { - if (_gnutls_rnd_ops.init == NULL) { - rnd_initialized = 1; - return 0; - } - - GNUTLS_STATIC_MUTEX_LOCK(gnutls_rnd_init_mutex); - if (!rnd_initialized) { - if (_gnutls_rnd_ops.init(&gnutls_rnd_ctx) < 0) { - gnutls_assert(); - GNUTLS_STATIC_MUTEX_UNLOCK(gnutls_rnd_init_mutex); - return GNUTLS_E_RANDOM_FAILED; - } - rnd_initialized = 1; - } - GNUTLS_STATIC_MUTEX_UNLOCK(gnutls_rnd_init_mutex); - } - return 0; -} -#else -static unsigned rnd_initialized = 0; +static _Thread_local unsigned rnd_initialized = 0; inline static int _gnutls_rnd_init(void) { - GNUTLS_STATIC_MUTEX_LOCK(gnutls_rnd_init_mutex); if (unlikely(!rnd_initialized)) { if (_gnutls_rnd_ops.init == NULL) { rnd_initialized = 1; - GNUTLS_STATIC_MUTEX_UNLOCK(gnutls_rnd_init_mutex); return 0; } if (_gnutls_rnd_ops.init(&gnutls_rnd_ctx) < 0) { gnutls_assert(); - GNUTLS_STATIC_MUTEX_UNLOCK(gnutls_rnd_init_mutex); return GNUTLS_E_RANDOM_FAILED; } rnd_initialized = 1; } - GNUTLS_STATIC_MUTEX_UNLOCK(gnutls_rnd_init_mutex); return 0; } -#endif int _gnutls_rnd_preinit(void) { |