yuzu/src/common/spin_lock.cpp

55 lines
876 B
C++
Raw Normal View History

// Copyright 2020 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#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 01:20:06 +03:00
void ThreadPause() {
#if __x86_64__
_mm_pause();
#elif __aarch64__ && _MSC_VER
__yield();
#elif __aarch64__
asm("yield");
#endif
}
2020-06-28 01:20:06 +03:00
} // Anonymous namespace
namespace Common {
void SpinLock::lock() {
2020-02-10 21:45:08 +03:00
while (lck.test_and_set(std::memory_order_acquire)) {
2020-06-28 01:20:06 +03:00
ThreadPause();
2020-02-10 21:45:08 +03: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