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