Sleeping Wombat Common Library  0.50.0
swCommonLibrary
SpinLock.h
1 #pragma once
2 
4 
5 #ifdef _M_AMD64
6 #include <mutex>
7 
8 typedef std::mutex SpinLock;
9 
10 #else
11 
12 
27 class SpinLock
28 {
29 private:
30  volatile int32 m_locked;
31 protected:
32 public:
33  SpinLock()
34  {
35  m_locked = 0;
36  }
37  ~SpinLock() = default;
38 
39  inline void lock();
40  inline void unlock();
41  inline bool try_lock();
42 };
43 
44 
47 inline void SpinLock::lock()
48 {
49  _asm
50  {
51  mov ecx, [this]
52  mov EAX, 0xF
53  TRY_LOCK_LABEL:
54  xchg EAX, [ecx].m_locked
55  and EAX, 0xFF
56  jnz TRY_LOCK_LABEL
57  }
58 }
59 
60 
63 inline void SpinLock::unlock()
64 {
65  _asm mov ecx, [this]
66  _asm mov [ecx.m_locked], 0x0
67  //_asm mov EAX, 0x0
68  //_asm xchg EAX, [ecx].m_locked
69 }
70 
71 
76 inline bool SpinLock::try_lock()
77 {
78  bool success = false;
79  _asm
80  {
81  mov ecx, [this]
82  mov EAX, 0xF
83  xchg EAX, [ecx].m_locked
84  cmp EAX, 0x0
85  jne LOCK_FAILED_LABEL
86  }
87  return true;
88  LOCK_FAILED_LABEL:
89  return false;
90 }
91 
92 #endif
Klasa służąca jako mutex z aktywnym oczekiwaniem.
Definition: SpinLock.h:27
void lock()
Wejście do sekcji krytycznej.
Definition: SpinLock.h:47
bool try_lock()
Próbuje zająć sekcję krytyczną. Jeżeli jest zajęta, wychodzi natychmiast.
Definition: SpinLock.h:76
Plik zawiera definicje podstawowych typów zmiennych.
void unlock()
Opuszczenie sekcji krytycznej.
Definition: SpinLock.h:63