spin_lock.cpp 857 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/spin_lock.h"
  4. #if _MSC_VER
  5. #include <intrin.h>
  6. #if _M_AMD64
  7. #define __x86_64__ 1
  8. #endif
  9. #if _M_ARM64
  10. #define __aarch64__ 1
  11. #endif
  12. #else
  13. #if __x86_64__
  14. #include <xmmintrin.h>
  15. #endif
  16. #endif
  17. namespace {
  18. void ThreadPause() {
  19. #if __x86_64__
  20. _mm_pause();
  21. #elif __aarch64__ && _MSC_VER
  22. __yield();
  23. #elif __aarch64__
  24. asm("yield");
  25. #endif
  26. }
  27. } // Anonymous namespace
  28. namespace Common {
  29. void SpinLock::lock() {
  30. while (lck.test_and_set(std::memory_order_acquire)) {
  31. ThreadPause();
  32. }
  33. }
  34. void SpinLock::unlock() {
  35. lck.clear(std::memory_order_release);
  36. }
  37. bool SpinLock::try_lock() {
  38. if (lck.test_and_set(std::memory_order_acquire)) {
  39. return false;
  40. }
  41. return true;
  42. }
  43. } // namespace Common