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 a178dd5a813ea9fc3db1f0d5ee4168a18c613c3a..dc2c6bac4d8c5384e065587fd7277dd8a9bb8ee4 100644 |
--- a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
+++ b/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h |
@@ -40,6 +40,17 @@ |
#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; |
@@ -53,11 +64,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) && |
- sys_futex(&x, FUTEX_WAKE, 1, 0) >= 0); |
+ have_futex = (sizeof (Atomic32) == sizeof (int) && |
+ syscall(__NR_futex, &x, FUTEX_WAKE, 1, 0) >= 0); |
#endif |
if (have_futex && |
- sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) { |
+ syscall(__NR_futex, &x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) { |
futex_private_flag = 0; |
} |
} |
@@ -81,7 +92,7 @@ void SpinLockDelay(volatile Atomic32 *w, int32 value, int loop) { |
tm.tv_nsec = 2000001; // above 2ms so linux 2.4 doesn't spin |
} |
if (have_futex) { |
- sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
+ syscall(__NR_futex, reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
FUTEX_WAIT | futex_private_flag, |
value, reinterpret_cast<struct kernel_timespec *>(&tm)); |
} else { |
@@ -93,8 +104,8 @@ void SpinLockDelay(volatile Atomic32 *w, int32 value, int loop) { |
void SpinLockWake(volatile Atomic32 *w, bool all) { |
if (have_futex) { |
- sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
- FUTEX_WAKE | futex_private_flag, all? INT_MAX : 1, 0); |
+ syscall(__NR_futex, reinterpret_cast<int *>(const_cast<Atomic32 *>(w)), |
+ FUTEX_WAKE | futex_private_flag, 1, 0); |
} |
} |