blob: 4ed0af51a8a5464a5d8fd9280b54bc3bcbacb048 [file] [log] [blame]
//
// 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