From: RĂ©mi Denis-Courmont Date: Sun, 11 Apr 2010 15:37:49 +0000 (+0300) Subject: Work-around non-thread-safe use of the C random number generator X-Git-Tag: 1.1.0-pre1~37 X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=4213a133fd1ef14fd9b62620412a45af091d73ae Work-around non-thread-safe use of the C random number generator --- diff --git a/bin/override.c b/bin/override.c index 5098a7d598..2f7606ba56 100644 --- a/bin/override.c +++ b/bin/override.c @@ -41,6 +41,7 @@ void vlc_enable_override (void) #include #include #include +#include static void vlogbug (const char *level, const char *func, const char *fmt, va_list ap) @@ -116,4 +117,34 @@ int unsetenv (const char *name) } +/*** Pseudo random numbers *** + * + * The C PRNG is not thread-safe (and generally sucks, the POSIX 48-bits PRNG + * is much better as a reproducible non-secure PRNG). To work around this, we + * force evil callers to serialize. This makes the call safe, but fails to + * preserve reproducibility of the number sequence (which usually does not + * matter). + **/ +static pthread_mutex_t prng_lock = PTHREAD_MUTEX_INITIALIZER; + +void srand (unsigned int seed) +{ + pthread_mutex_lock (&prng_lock); + LOG("Warning", "%d", seed); + CALL(srand, seed); + pthread_mutex_unlock (&prng_lock); +} + +int rand (void) +{ + int ret; + + pthread_mutex_lock (&prng_lock); + LOG("Warning", ""); + ret = CALL(rand); + pthread_mutex_unlock (&prng_lock); + return ret; +} + + #endif /* __ELF__ */