diff options
author | jasone <jasone@FreeBSD.org> | 2008-11-30 05:55:24 +0000 |
---|---|---|
committer | jasone <jasone@FreeBSD.org> | 2008-11-30 05:55:24 +0000 |
commit | 8562e5b08027692b9a31552d59055ac5acd15e68 (patch) | |
tree | 38239dc216b9baa3b61073ab3c3493a6fa446d76 /lib/libc/stdlib/malloc.c | |
parent | 31f060edeb2330f4c206104ddc15da2d8718bed8 (diff) | |
download | FreeBSD-src-8562e5b08027692b9a31552d59055ac5acd15e68.zip FreeBSD-src-8562e5b08027692b9a31552d59055ac5acd15e68.tar.gz |
Do not spin when trying to lock on a single-CPU system.
Reported by: davidxu
Diffstat (limited to 'lib/libc/stdlib/malloc.c')
-rw-r--r-- | lib/libc/stdlib/malloc.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 55bc413..4b37e72 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -1262,18 +1262,20 @@ malloc_spin_lock(pthread_mutex_t *lock) if (__isthreaded) { if (_pthread_mutex_trylock(lock) != 0) { - unsigned i; - volatile unsigned j; - - /* Exponentially back off. */ - for (i = 1; i <= SPIN_LIMIT_2POW; i++) { - for (j = 0; j < (1U << i); j++) { - ret++; - CPU_SPINWAIT; + /* Exponentially back off if there are multiple CPUs. */ + if (ncpus > 1) { + unsigned i; + volatile unsigned j; + + for (i = 1; i <= SPIN_LIMIT_2POW; i++) { + for (j = 0; j < (1U << i); j++) { + ret++; + CPU_SPINWAIT; + } + + if (_pthread_mutex_trylock(lock) == 0) + return (ret); } - - if (_pthread_mutex_trylock(lock) == 0) - return (ret); } /* |