// // 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 # include # if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) # include # include # include # endif // defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID) # if defined(ANGLE_PLATFORM_WINDOWS) # include # include # 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