| // | |
| // Copyright 2024 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // SimpleMutex.cpp: | |
| // Implementation of SimpleMutex.h. | |
| #include "common/SimpleMutex.h" | |
| #if ANGLE_USE_FUTEX | |
| # include <limits.h> | |
| # include <stdint.h> | |
| # if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) | |
| # include <linux/futex.h> | |
| # include <sys/syscall.h> | |
| # include <unistd.h> | |
| # endif // defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) | |
| # if defined(ANGLE_PLATFORM_WINDOWS) | |
| # include <errno.h> | |
| # include <windows.h> | |
| # endif // defined(ANGLE_PLATFORM_WINDOWS) | |
| namespace angle | |
| { | |
| namespace priv | |
| { | |
| # if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) | |
| namespace | |
| { | |
| ANGLE_INLINE void SysFutex(void *addr, int op, int val, int val3) | |
| { | |
| syscall(SYS_futex, addr, op, val, nullptr, nullptr, val3); | |
| } | |
| } // anonymous namespace | |
| void MutexOnFutex::futexWait() | |
| { | |
| SysFutex(&mState, FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG, kBlocked, FUTEX_BITSET_MATCH_ANY); | |
| } | |
| void MutexOnFutex::futexWake() | |
| { | |
| SysFutex(&mState, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, kLocked, 0); | |
| } | |
| # endif // defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) | |
| # if defined(ANGLE_PLATFORM_WINDOWS) | |
| void MutexOnFutex::futexWait() | |
| { | |
| int value = kBlocked; | |
| WaitOnAddress(&mState, &value, sizeof(value), INFINITE); | |
| } | |
| void MutexOnFutex::futexWake() | |
| { | |
| WakeByAddressSingle(&mState); | |
| } | |
| # endif // defined(ANGLE_PLATFORM_WINDOWS) | |
| } // namespace priv | |
| } // namespace angle | |
| #endif // ANGLE_USE_FUTEX |