| 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 dc2c6bac4d8c5384e065587fd7277dd8a9bb8ee4..bee2d4cedb123ecd61889fc18775a8e60d804e5c 100644
|
| --- a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h
|
| +++ b/third_party/tcmalloc/chromium/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>
|
| @@ -40,17 +41,6 @@
|
| #define FUTEX_WAKE 1
|
| #define FUTEX_PRIVATE_FLAG 128
|
|
|
| -// Note: Instead of making direct system calls that are inlined, we rely
|
| -// on the syscall() function in glibc to do the right thing. This
|
| -// is necessary to make the code compatible with the seccomp sandbox,
|
| -// which needs to be able to find and patch all places where system
|
| -// calls are made. Scanning through and patching glibc is fast, but
|
| -// doing so on the entire Chrome binary would be prohibitively
|
| -// expensive.
|
| -// This is a notable change from the upstream version of tcmalloc,
|
| -// which prefers direct system calls in order to improve compatibility
|
| -// with older toolchains and runtime libraries.
|
| -
|
| static bool have_futex;
|
| static int futex_private_flag = FUTEX_PRIVATE_FLAG;
|
|
|
| @@ -64,11 +54,11 @@ static struct InitModule {
|
| // ARM linux doesn't support sys_futex1(void*, int, int, struct timespec*);
|
| have_futex = 0;
|
| #else
|
| - have_futex = (sizeof (Atomic32) == sizeof (int) &&
|
| - syscall(__NR_futex, &x, FUTEX_WAKE, 1, 0) >= 0);
|
| + have_futex = (sizeof (Atomic32) == sizeof (int) &&
|
| + sys_futex(&x, FUTEX_WAKE, 1, 0) >= 0);
|
| #endif
|
| if (have_futex &&
|
| - syscall(__NR_futex, &x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) {
|
| + sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) {
|
| futex_private_flag = 0;
|
| }
|
| }
|
| @@ -86,13 +76,13 @@ 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) {
|
| - syscall(__NR_futex, reinterpret_cast<int *>(const_cast<Atomic32 *>(w)),
|
| + 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));
|
| } else {
|
| @@ -104,8 +94,8 @@ void SpinLockDelay(volatile Atomic32 *w, int32 value, int loop) {
|
|
|
| void SpinLockWake(volatile Atomic32 *w, bool all) {
|
| if (have_futex) {
|
| - syscall(__NR_futex, reinterpret_cast<int *>(const_cast<Atomic32 *>(w)),
|
| - FUTEX_WAKE | futex_private_flag, 1, 0);
|
| + sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)),
|
| + FUTEX_WAKE | futex_private_flag, all? INT_MAX : 1, 0);
|
| }
|
| }
|
|
|
|
|