summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjasone <jasone@FreeBSD.org>2008-11-30 05:55:24 +0000
committerjasone <jasone@FreeBSD.org>2008-11-30 05:55:24 +0000
commit8562e5b08027692b9a31552d59055ac5acd15e68 (patch)
tree38239dc216b9baa3b61073ab3c3493a6fa446d76
parent31f060edeb2330f4c206104ddc15da2d8718bed8 (diff)
downloadFreeBSD-src-8562e5b08027692b9a31552d59055ac5acd15e68.zip
FreeBSD-src-8562e5b08027692b9a31552d59055ac5acd15e68.tar.gz
Do not spin when trying to lock on a single-CPU system.
Reported by: davidxu
-rw-r--r--lib/libc/stdlib/malloc.c24
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);
}
/*
OpenPOWER on IntegriCloud