diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-04-24 16:32:23 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-04-24 16:32:23 -0400 |
commit | 4750cf4202c29a895639b89099a7bdbe9ae422b6 (patch) | |
tree | b682c69140ada09d2c498a80e7d84865d4c51e60 /src/prng | |
parent | e7655ed37bc9c2d79d921af4f287ee5cf2788661 (diff) | |
download | musl-4750cf4202c29a895639b89099a7bdbe9ae422b6.tar.gz musl-4750cf4202c29a895639b89099a7bdbe9ae422b6.tar.bz2 musl-4750cf4202c29a895639b89099a7bdbe9ae422b6.tar.xz musl-4750cf4202c29a895639b89099a7bdbe9ae422b6.zip |
ditch the priority inheritance locks; use malloc's version of lock
i did some testing trying to switch malloc to use the new internal
lock with priority inheritance, and my malloc contention test got
20-100 times slower. if priority inheritance futexes are this slow,
it's simply too high a price to pay for avoiding priority inversion.
maybe we can consider them somewhere down the road once the kernel
folks get their act together on this (and perferably don't link it to
glibc's inefficient lock API)...
as such, i've switch __lock to use malloc's implementation of
lightweight locks, and updated all the users of the code to use an
array with a waiter count for their locks. this should give optimal
performance in the vast majority of cases, and it's simple.
malloc is still using its own internal copy of the lock code because
it seems to yield measurably better performance with -O3 when it's
inlined (20% or more difference in the contention stress test).
Diffstat (limited to 'src/prng')
-rw-r--r-- | src/prng/random.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/prng/random.c b/src/prng/random.c index cc5702ed..4ad62058 100644 --- a/src/prng/random.c +++ b/src/prng/random.c @@ -33,7 +33,7 @@ static int n = 31; static int i = 3; static int j = 0; static uint32_t *x = init+1; -static int lock; +static int lock[2]; static uint32_t lcg31(uint32_t x) { return (1103515245*x + 12345) & 0x7fffffff; @@ -74,9 +74,9 @@ static void __srandom(unsigned seed) { } void srandom(unsigned seed) { - LOCK(&lock); + LOCK(lock); __srandom(seed); - UNLOCK(&lock); + UNLOCK(lock); } char *initstate(unsigned seed, char *state, size_t size) { @@ -84,7 +84,7 @@ char *initstate(unsigned seed, char *state, size_t size) { if (size < 8) return 0; - LOCK(&lock); + LOCK(lock); old = savestate(); if (size < 32) n = 0; @@ -98,24 +98,24 @@ char *initstate(unsigned seed, char *state, size_t size) { n = 63; x = (uint32_t*)state + 1; __srandom(seed); - UNLOCK(&lock); + UNLOCK(lock); return old; } char *setstate(char *state) { void *old; - LOCK(&lock); + LOCK(lock); old = savestate(); loadstate((uint32_t*)state); - UNLOCK(&lock); + UNLOCK(lock); return old; } long random(void) { long k; - LOCK(&lock); + LOCK(lock); if (n == 0) { k = x[0] = lcg31(x[0]); goto end; @@ -127,6 +127,6 @@ long random(void) { if (++j == n) j = 0; end: - UNLOCK(&lock); + UNLOCK(lock); return k; } |