-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathCriticalSectionClass.h
99 lines (65 loc) · 1.3 KB
/
CriticalSectionClass.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
89
90
91
92
93
94
95
96
97
98
99
#pragma once
class CriticalSectionClass
{
private:
void* handle;
unsigned int locked;
public:
class LockClass
{
private:
CriticalSectionClass& CriticalSection;
public:
LockClass(CriticalSectionClass& section);
~LockClass();
LockClass operator=(LockClass&);
};
CriticalSectionClass();
~CriticalSectionClass();
void Enter();
void Exit();
CriticalSectionClass(const CriticalSectionClass&) = delete;
CriticalSectionClass& operator = (const CriticalSectionClass&) = delete;
};
class FastCriticalSectionClass
{
private:
friend class LockClass;
volatile long Flag; // 0000
void Enter()
{
UL_ASSERT((size_t)&Flag % 4 == 0); // aligned to 4 bytes please
for (;;)
{
if (_interlockedbittestandset(&Flag, 0) == 0) return;
_mm_pause();
};
}
void Leave()
{
Flag = 0;
}
public:
class LockClass
{
FastCriticalSectionClass& criticalSection;
LockClass& operator=(const LockClass&)
{
return *this;
}
public:
LockClass(FastCriticalSectionClass& _criticalSection) :
criticalSection(_criticalSection)
{
criticalSection.Enter();
}
~LockClass()
{
criticalSection.Leave();
}
};
FastCriticalSectionClass() :
Flag(0)
{
}
}; // 0004