Iros
 
Loading...
Searching...
No Matches
dumb_spinlock.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/sync/atomic.h"
5
6namespace di::sync {
7inline void cpu_relax() {
8#ifdef __x86_64__
9 asm volatile("pause" ::: "memory");
10#endif
11}
12
14public:
15 DumbSpinlock() = default;
16
17 DumbSpinlock(DumbSpinlock const&) = delete;
18 auto operator=(DumbSpinlock const&) -> DumbSpinlock& = delete;
19
20 void lock() {
21 for (;;) {
22 if (try_lock()) {
23 return;
24 }
25 while (m_state.load(MemoryOrder::Relaxed)) {
26 cpu_relax();
27 }
28 }
29 }
30 auto try_lock() -> bool { return !m_state.exchange(true, MemoryOrder::Acquire); }
31 void unlock() { m_state.store(false, MemoryOrder::Release); }
32
33private:
34 Atomic<bool> m_state { false };
35};
36}
37
38namespace di {
39using sync::cpu_relax;
41}
Definition atomic.h:15
Definition dumb_spinlock.h:13
void unlock()
Definition dumb_spinlock.h:31
DumbSpinlock(DumbSpinlock const &)=delete
auto operator=(DumbSpinlock const &) -> DumbSpinlock &=delete
void lock()
Definition dumb_spinlock.h:20
auto try_lock() -> bool
Definition dumb_spinlock.h:30
Definition atomic.h:12
@ Relaxed
Definition memory_order.h:7
@ Acquire
Definition memory_order.h:9
@ Release
Definition memory_order.h:10
void cpu_relax()
Definition dumb_spinlock.h:7
Definition zstring_parser.h:9