diff options
author | jln@chromium.org <jln@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-08 17:27:19 +0000 |
---|---|---|
committer | jln@chromium.org <jln@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-08 17:27:19 +0000 |
commit | ff7319a88defa09542250dc15a7273f37a7de6d7 (patch) | |
tree | 8a931c56d7f4d844444663b27aa59f8a5e542e2d /third_party | |
parent | ce37a153aa8edcda878ca8dde0a61f43e514c88f (diff) | |
download | chromium_src-ff7319a88defa09542250dc15a7273f37a7de6d7.zip chromium_src-ff7319a88defa09542250dc15a7273f37a7de6d7.tar.gz chromium_src-ff7319a88defa09542250dc15a7273f37a7de6d7.tar.bz2 |
TCMalloc: reduce waiting time in SpinLockDelay on Linux
Because of an optimization in Unlock(), we can't expect explicit
wake-ups and shouldn't wait for too long in SpinLockDelay.
BUG=168139
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/11784009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175543 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party')
-rw-r--r-- | third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h | 10 |
1 files changed, 5 insertions, 5 deletions
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 c190d52..4a1498d 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; |