1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // SimpleMutex.cpp:
7*8975f5c5SAndroid Build Coastguard Worker // Implementation of SimpleMutex.h.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_USE_FUTEX
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker # include <limits.h>
14*8975f5c5SAndroid Build Coastguard Worker # include <stdint.h>
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker # if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID)
17*8975f5c5SAndroid Build Coastguard Worker # include <linux/futex.h>
18*8975f5c5SAndroid Build Coastguard Worker # include <sys/syscall.h>
19*8975f5c5SAndroid Build Coastguard Worker # include <unistd.h>
20*8975f5c5SAndroid Build Coastguard Worker # endif // defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID)
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker # if defined(ANGLE_PLATFORM_WINDOWS)
23*8975f5c5SAndroid Build Coastguard Worker # include <errno.h>
24*8975f5c5SAndroid Build Coastguard Worker # include <windows.h>
25*8975f5c5SAndroid Build Coastguard Worker # endif // defined(ANGLE_PLATFORM_WINDOWS)
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker namespace angle
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker namespace priv
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker # if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID)
32*8975f5c5SAndroid Build Coastguard Worker namespace
33*8975f5c5SAndroid Build Coastguard Worker {
SysFutex(void * addr,int op,int val,int val3)34*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void SysFutex(void *addr, int op, int val, int val3)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker syscall(SYS_futex, addr, op, val, nullptr, nullptr, val3);
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
39*8975f5c5SAndroid Build Coastguard Worker
futexWait()40*8975f5c5SAndroid Build Coastguard Worker void MutexOnFutex::futexWait()
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker SysFutex(&mState, FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG, kBlocked, FUTEX_BITSET_MATCH_ANY);
43*8975f5c5SAndroid Build Coastguard Worker }
futexWake()44*8975f5c5SAndroid Build Coastguard Worker void MutexOnFutex::futexWake()
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker SysFutex(&mState, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, kLocked, 0);
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker # endif // defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_ANDROID)
49*8975f5c5SAndroid Build Coastguard Worker
50*8975f5c5SAndroid Build Coastguard Worker # if defined(ANGLE_PLATFORM_WINDOWS)
futexWait()51*8975f5c5SAndroid Build Coastguard Worker void MutexOnFutex::futexWait()
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker int value = kBlocked;
54*8975f5c5SAndroid Build Coastguard Worker WaitOnAddress(&mState, &value, sizeof(value), INFINITE);
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
futexWake()57*8975f5c5SAndroid Build Coastguard Worker void MutexOnFutex::futexWake()
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker WakeByAddressSingle(&mState);
60*8975f5c5SAndroid Build Coastguard Worker }
61*8975f5c5SAndroid Build Coastguard Worker # endif // defined(ANGLE_PLATFORM_WINDOWS)
62*8975f5c5SAndroid Build Coastguard Worker } // namespace priv
63*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker #endif // ANGLE_USE_FUTEX
66