diff options
| author | bunnei <bunneidev@gmail.com> | 2021-02-27 12:48:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-27 12:48:35 -0700 |
| commit | 09f7c355c6d7e3c7845ba96d9704489d2d5853f4 (patch) | |
| tree | b12127263c0e4999f0a6e9edfe7f8f25adef9d37 /src/core/hle/kernel/k_spin_lock.cpp | |
| parent | bfa16444640049b2c265fb3f2491252a1d1fe5fd (diff) | |
| parent | 93e20867b0ab2e737e231a9b5bb29d40947fb311 (diff) | |
Merge pull request #5953 from bunnei/memory-refactor-1
Kernel Rework: Memory updates and refactoring (Part 1)
Diffstat (limited to 'src/core/hle/kernel/k_spin_lock.cpp')
| -rw-r--r-- | src/core/hle/kernel/k_spin_lock.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_spin_lock.cpp b/src/core/hle/kernel/k_spin_lock.cpp new file mode 100644 index 000000000..4412aa4bb --- /dev/null +++ b/src/core/hle/kernel/k_spin_lock.cpp @@ -0,0 +1,54 @@ +// Copyright 2021 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/kernel/k_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 { + +void ThreadPause() { +#if __x86_64__ + _mm_pause(); +#elif __aarch64__ && _MSC_VER + __yield(); +#elif __aarch64__ + asm("yield"); +#endif +} + +} // namespace + +namespace Kernel { + +void KSpinLock::Lock() { + while (lck.test_and_set(std::memory_order_acquire)) { + ThreadPause(); + } +} + +void KSpinLock::Unlock() { + lck.clear(std::memory_order_release); +} + +bool KSpinLock::TryLock() { + if (lck.test_and_set(std::memory_order_acquire)) { + return false; + } + return true; +} + +} // namespace Kernel |
