yuzu/src/common/spin_lock.cpp

54 lines
857 B
C++
Raw Normal View History

// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/spin_lock.h"
#if _MSC_VER
#include <intrin.h>
#if _M_AMD64
#define __x86_64__ 1
#endif
#if _M_ARM64
#define __aarch64__ 1
#endif
#else
#if __x86_64__
#include <xmmintrin.h>
#endif
#endif
namespace {
2020-06-28 00:20:06 +02:00
void ThreadPause() {
#if __x86_64__
_mm_pause();
#elif __aarch64__ && _MSC_VER
__yield();
#elif __aarch64__
asm("yield");
#endif
}
2020-06-28 00:20:06 +02:00
} // Anonymous namespace
namespace Common {
void SpinLock::lock() {
2020-02-10 19:45:08 +01:00
while (lck.test_and_set(std::memory_order_acquire)) {
2020-06-28 00:20:06 +02:00
ThreadPause();
2020-02-10 19:45:08 +01:00
}
}
void SpinLock::unlock() {
lck.clear(std::memory_order_release);
}
bool SpinLock::try_lock() {
if (lck.test_and_set(std::memory_order_acquire)) {
return false;
}
return true;
}
} // namespace Common