X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fprng%2Frandom.c;h=4ad62058db7ecbcd83e5cc5a395ba1fa2e45ff03;hb=a7936f61b23100ac32f51776c5b3e52452c7598c;hp=4b2daef2116774776d8287c2191478442309efea;hpb=c7ce1b20d2f37f97f9cfcd57cb4fb4c7cd66a3a0;p=musl diff --git a/src/prng/random.c b/src/prng/random.c index 4b2daef2..4ad62058 100644 --- a/src/prng/random.c +++ b/src/prng/random.c @@ -7,6 +7,7 @@ #include #include +#include "libc.h" /* this code uses the same lagged fibonacci generator as the @@ -32,6 +33,7 @@ static int n = 31; static int i = 3; static int j = 0; static uint32_t *x = init+1; +static int lock[2]; static uint32_t lcg31(uint32_t x) { return (1103515245*x + 12345) & 0x7fffffff; @@ -53,7 +55,7 @@ static void loadstate(uint32_t *state) { j = x[-1]&0xff; } -void srandom(unsigned seed) { +static void __srandom(unsigned seed) { int k; uint64_t s = seed; @@ -71,11 +73,20 @@ void srandom(unsigned seed) { x[0] |= 1; } +void srandom(unsigned seed) { + LOCK(lock); + __srandom(seed); + UNLOCK(lock); +} + char *initstate(unsigned seed, char *state, size_t size) { - void *old = savestate(); + void *old; + if (size < 8) return 0; - else if (size < 32) + LOCK(lock); + old = savestate(); + if (size < 32) n = 0; else if (size < 64) n = 7; @@ -86,26 +97,36 @@ char *initstate(unsigned seed, char *state, size_t size) { else n = 63; x = (uint32_t*)state + 1; - srandom(seed); + __srandom(seed); + UNLOCK(lock); return old; } char *setstate(char *state) { - void *old = savestate(); + void *old; + + LOCK(lock); + old = savestate(); loadstate((uint32_t*)state); + UNLOCK(lock); return old; } long random(void) { long k; - if (n == 0) - return x[0] = lcg31(x[0]); + LOCK(lock); + if (n == 0) { + k = x[0] = lcg31(x[0]); + goto end; + } x[i] += x[j]; k = x[i]>>1; if (++i == n) i = 0; if (++j == n) j = 0; +end: + UNLOCK(lock); return k; }