| Index: sandbox/linux/seccomp/mutex.h
|
| ===================================================================
|
| --- sandbox/linux/seccomp/mutex.h (revision 57969)
|
| +++ sandbox/linux/seccomp/mutex.h (working copy)
|
| @@ -1,153 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef MUTEX_H__
|
| -#define MUTEX_H__
|
| -
|
| -#include "sandbox_impl.h"
|
| -
|
| -namespace playground {
|
| -
|
| -class Mutex {
|
| - public:
|
| - typedef int mutex_t;
|
| -
|
| - enum { kInitValue = 0 };
|
| -
|
| - static void initMutex(mutex_t* mutex) {
|
| - // Mutex is unlocked, and nobody is waiting for it
|
| - *mutex = kInitValue;
|
| - }
|
| -
|
| - static void unlockMutex(mutex_t* mutex) {
|
| - char status;
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; addl %2, %0\n"
|
| - "setz %1"
|
| - : "=m"(*mutex), "=qm"(status)
|
| - : "ir"(0x80000000), "m"(*mutex));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - if (status) {
|
| - // Mutex is zero now. No other waiters. So, we can return.
|
| - return;
|
| - }
|
| - // We unlocked the mutex, but still need to wake up other waiters.
|
| - Sandbox::SysCalls sys;
|
| - sys.futex(mutex, FUTEX_WAKE, 1, NULL);
|
| - }
|
| -
|
| - static bool lockMutex(mutex_t* mutex, int timeout = 0) {
|
| - bool rc = true;
|
| - // Increment mutex to add ourselves to the list of waiters
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; incl %0\n"
|
| - : "=m"(*mutex)
|
| - : "m"(*mutex));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - for (;;) {
|
| - // Atomically check whether the mutex is available and if so, acquire it
|
| - char status;
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; btsl %3, %1\n"
|
| - "setc %0"
|
| - : "=q"(status), "=m"(*mutex)
|
| - : "m"(*mutex), "ir"(31));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - if (!status) {
|
| - done:
|
| - // If the mutex was available, remove ourselves from list of waiters
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; decl %0\n"
|
| - : "=m"(*mutex)
|
| - : "m"(*mutex));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - return rc;
|
| - }
|
| - int value = *mutex;
|
| - if (value >= 0) {
|
| - // Mutex has just become available, no need to call kernel
|
| - continue;
|
| - }
|
| - Sandbox::SysCalls sys;
|
| - Sandbox::SysCalls::kernel_timespec tm;
|
| - if (timeout) {
|
| - tm.tv_sec = timeout / 1000;
|
| - tm.tv_nsec = (timeout % 1000) * 1000 * 1000;
|
| - } else {
|
| - tm.tv_sec = 0;
|
| - tm.tv_nsec = 0;
|
| - }
|
| - if (NOINTR_SYS(sys.futex(mutex, FUTEX_WAIT, value, &tm)) &&
|
| - sys.my_errno == ETIMEDOUT) {
|
| - rc = false;
|
| - goto done;
|
| - }
|
| - }
|
| - }
|
| -
|
| - static bool waitForUnlock(mutex_t* mutex, int timeout = 0) {
|
| - bool rc = true;
|
| - // Increment mutex to add ourselves to the list of waiters
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; incl %0\n"
|
| - : "=m"(*mutex)
|
| - : "m"(*mutex));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - Sandbox::SysCalls sys;
|
| - for (;;) {
|
| - mutex_t value = *mutex;
|
| - if (value >= 0) {
|
| - done:
|
| - // Mutex was not locked. Remove ourselves from list of waiters, notify
|
| - // any other waiters (if any), and return.
|
| - #if defined(__x86_64__) || defined(__i386__)
|
| - asm volatile(
|
| - "lock; decl %0\n"
|
| - : "=m"(*mutex)
|
| - : "m"(*mutex));
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| - NOINTR_SYS(sys.futex(mutex, FUTEX_WAKE, 1, 0));
|
| - return rc;
|
| - }
|
| -
|
| - // Wait for mutex to become unlocked
|
| - Sandbox::SysCalls::kernel_timespec tm;
|
| - if (timeout) {
|
| - tm.tv_sec = timeout / 1000;
|
| - tm.tv_nsec = (timeout % 1000) * 1000 * 1000;
|
| - } else {
|
| - tm.tv_sec = 0;
|
| - tm.tv_nsec = 0;
|
| - }
|
| -
|
| - if (NOINTR_SYS(sys.futex(mutex, FUTEX_WAIT, value, &tm)) &&
|
| - sys.my_errno == ETIMEDOUT) {
|
| - rc = false;
|
| - goto done;
|
| - }
|
| - }
|
| - }
|
| -
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -#endif // MUTEX_H__
|
|
|