xref: /aosp_15_r20/external/angle/src/common/SimpleMutex.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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