-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspinlock.h
88 lines (76 loc) · 1.68 KB
/
spinlock.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#pragma once
#include "config.h"
#define zhaoxi
#include"common/lock.h"
namespace co
{
#if LIBGO_SINGLE_THREAD
struct LFLock
{
bool locked_ = false;
ALWAYS_INLINE void lock()
{
while (!locked_) locked_ = true;
DebugPrint(dbg_spinlock, "lock");
}
ALWAYS_INLINE bool try_lock()
{
bool ret = !locked_;
if (ret) locked_ = true;
DebugPrint(dbg_spinlock, "trylock returns %s", ret ? "true" : "false");
return ret;
}
ALWAYS_INLINE void unlock()
{
assert(locked_);
locked_ = false;
DebugPrint(dbg_spinlock, "unlock");
}
};
#endif
#if LIBGO_SINGLE_THREAD_
struct LFLock
{
volatile std::atomic_flag lck;
LFLock()
{
lck.clear();
}
ALWAYS_INLINE void lock()
{
while (std::atomic_flag_test_and_set_explicit(&lck, std::memory_order_acquire)) ;
DebugPrint(dbg_spinlock, "lock");
}
ALWAYS_INLINE bool try_lock()
{
bool ret = !std::atomic_flag_test_and_set_explicit(&lck, std::memory_order_acquire);
DebugPrint(dbg_spinlock, "trylock returns %s", ret ? "true" : "false");
return ret;
}
ALWAYS_INLINE void unlock()
{
std::atomic_flag_clear_explicit(&lck, std::memory_order_release);
DebugPrint(dbg_spinlock, "unlock");
}
};
#endif //LIBGO_SINGLE_THREAD
#ifdef zhaoxi
struct LFLock {
public:
LFLock() {
S_INIT_LOCK(&splock);
}
ALWAYS_INLINE void lock() {
S_LOCK(&splock);
}
ALWAYS_INLINE bool try_lock() {
return (bool) S_LOCK_FREE(&splock); //true not lock ,can be lock
}
ALWAYS_INLINE void unlock() {
S_UNLOCK(&splock);
}
private:
volatile slock_t splock;
};
#endif
} //namespace co