k_spin_lock.cpp 879 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/hle/kernel/k_spin_lock.h"
  5. #if _MSC_VER
  6. #include <intrin.h>
  7. #if _M_AMD64
  8. #define __x86_64__ 1
  9. #endif
  10. #if _M_ARM64
  11. #define __aarch64__ 1
  12. #endif
  13. #else
  14. #if __x86_64__
  15. #include <xmmintrin.h>
  16. #endif
  17. #endif
  18. namespace {
  19. void ThreadPause() {
  20. #if __x86_64__
  21. _mm_pause();
  22. #elif __aarch64__ && _MSC_VER
  23. __yield();
  24. #elif __aarch64__
  25. asm("yield");
  26. #endif
  27. }
  28. } // namespace
  29. namespace Kernel {
  30. void KSpinLock::Lock() {
  31. while (lck.test_and_set(std::memory_order_acquire)) {
  32. ThreadPause();
  33. }
  34. }
  35. void KSpinLock::Unlock() {
  36. lck.clear(std::memory_order_release);
  37. }
  38. bool KSpinLock::TryLock() {
  39. if (lck.test_and_set(std::memory_order_acquire)) {
  40. return false;
  41. }
  42. return true;
  43. }
  44. } // namespace Kernel