diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-04 16:23:12 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-06-18 22:29:13 +0200 |
commit | 13ed9438fb47d62663fb1ef367baac1a567b25b3 (patch) | |
tree | 6b342b85f39bde149532d7af8a06186560221f31 /src/common | |
parent | Merge pull request #4108 from ReinUsesLisp/a32-implicit-cast (diff) | |
download | yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar.gz yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar.bz2 yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar.lz yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar.xz yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.tar.zst yuzu-13ed9438fb47d62663fb1ef367baac1a567b25b3.zip |
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/common/spin_lock.cpp | 46 | ||||
-rw-r--r-- | src/common/spin_lock.h | 20 |
3 files changed, 68 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 0a3e2f4d1..c8bf80372 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -143,6 +143,8 @@ add_library(common STATIC scm_rev.cpp scm_rev.h scope_exit.h + spin_lock.cpp + spin_lock.h string_util.cpp string_util.h swap.h diff --git a/src/common/spin_lock.cpp b/src/common/spin_lock.cpp new file mode 100644 index 000000000..8077b78d2 --- /dev/null +++ b/src/common/spin_lock.cpp @@ -0,0 +1,46 @@ +// 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 { + +void thread_pause() { +#if __x86_64__ + _mm_pause(); +#elif __aarch64__ && _MSC_VER + __yield(); +#elif __aarch64__ + asm("yield"); +#endif +} + +} // namespace + +namespace Common { + +void SpinLock::lock() { + while (lck.test_and_set(std::memory_order_acquire)) + thread_pause(); +} + +void SpinLock::unlock() { + lck.clear(std::memory_order_release); +} + +} // namespace Common diff --git a/src/common/spin_lock.h b/src/common/spin_lock.h new file mode 100644 index 000000000..cbc67b6c8 --- /dev/null +++ b/src/common/spin_lock.h @@ -0,0 +1,20 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <atomic> + +namespace Common { + +class SpinLock { +public: + void lock(); + void unlock(); + +private: + std::atomic_flag lck = ATOMIC_FLAG_INIT; +}; + +} // namespace Common |