Index: third_party/tcmalloc/vendor/src/base/spinlock_linux-inl.h |
diff --git a/third_party/tcmalloc/vendor/src/base/spinlock_linux-inl.h b/third_party/tcmalloc/vendor/src/base/spinlock_linux-inl.h |
index a178dd5a813ea9fc3db1f0d5ee4168a18c613c3a..bee2d4cedb123ecd61889fc18775a8e60d804e5c 100644 |
--- a/third_party/tcmalloc/vendor/src/base/spinlock_linux-inl.h |
+++ b/third_party/tcmalloc/vendor/src/base/spinlock_linux-inl.h |
@@ -31,6 +31,7 @@ |
* This file is a Linux-specific part of spinlock_internal.cc |
*/ |
+#include <errno.h> |
#include <sched.h> |
#include <time.h> |
#include <limits.h> |
@@ -75,12 +76,12 @@ void SpinLockDelay(volatile Atomic32 *w, int32 value, int loop) { |
struct timespec tm; |
tm.tv_sec = 0; |
if (have_futex) { |
- tm.tv_nsec = 1000000; // 1ms; really we're trying to sleep for one |
- // kernel clock tick |
+ tm.tv_nsec = base::internal::SuggestedDelayNS(loop); |
} else { |
tm.tv_nsec = 2000001; // above 2ms so linux 2.4 doesn't spin |
} |
if (have_futex) { |
+ tm.tv_nsec *= 16; // increase the delay; we expect explicit wakeups |
sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
FUTEX_WAIT | futex_private_flag, |
value, reinterpret_cast<struct kernel_timespec *>(&tm)); |