Index: third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
diff --git a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h b/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
index c190d525aa6bc5efecf3a307f71c5c182555d721..4a1498db97c95d3b33821f1f852343bb5ba2f2b4 100644 |
--- a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
+++ b/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
@@ -87,16 +87,16 @@ void SpinLockDelay(volatile Atomic32 *w, int32 value, int loop) { |
struct timespec tm; |
tm.tv_sec = 0; |
if (have_futex) { |
+ // Wait between 0-16ms. |
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 |
+ // Note: since Unlock() is optimized to not do a compare-and-swap, |
+ // we can't expect explicit wake-ups. Therefore we shouldn't wait too |
+ // long here. |
syscall(__NR_futex, reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
FUTEX_WAIT | futex_private_flag, |
value, reinterpret_cast<struct kernel_timespec *>(&tm)); |
} else { |
+ tm.tv_nsec = 2000001; // above 2ms so linux 2.4 doesn't spin |
nanosleep(&tm, NULL); |
} |
errno = save_errno; |