1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | #ifndef __GCENV_SYNC_H__ |
5 | #define __GCENV_SYNC_H__ |
6 | |
7 | // ----------------------------------------------------------------------------------------------------------- |
8 | // |
9 | // Helper classes expected by the GC |
10 | // |
11 | #define CRST_REENTRANCY 0 |
12 | #define CRST_UNSAFE_SAMELEVEL 0 |
13 | #define CRST_UNSAFE_ANYMODE 0 |
14 | #define CRST_DEBUGGER_THREAD 0 |
15 | #define CRST_DEFAULT 0 |
16 | |
17 | #define CrstHandleTable 0 |
18 | |
19 | typedef int CrstFlags; |
20 | typedef int CrstType; |
21 | |
22 | class CrstStatic |
23 | { |
24 | CLRCriticalSection m_cs; |
25 | #ifdef _DEBUG |
26 | EEThreadId m_holderThreadId; |
27 | #endif |
28 | |
29 | public: |
30 | bool InitNoThrow(CrstType eType, CrstFlags eFlags = CRST_DEFAULT) |
31 | { |
32 | m_cs.Initialize(); |
33 | return true; |
34 | } |
35 | |
36 | void Destroy() |
37 | { |
38 | m_cs.Destroy(); |
39 | } |
40 | |
41 | void Enter() |
42 | { |
43 | m_cs.Enter(); |
44 | #ifdef _DEBUG |
45 | m_holderThreadId.SetToCurrentThread(); |
46 | #endif |
47 | } |
48 | |
49 | void Leave() |
50 | { |
51 | #ifdef _DEBUG |
52 | m_holderThreadId.Clear(); |
53 | #endif |
54 | m_cs.Leave(); |
55 | } |
56 | |
57 | #ifdef _DEBUG |
58 | EEThreadId GetHolderThreadId() |
59 | { |
60 | return m_holderThreadId; |
61 | } |
62 | |
63 | bool OwnedByCurrentThread() |
64 | { |
65 | return GetHolderThreadId().IsCurrentThread(); |
66 | } |
67 | #endif |
68 | }; |
69 | |
70 | class CrstHolder |
71 | { |
72 | CrstStatic * m_pLock; |
73 | |
74 | public: |
75 | CrstHolder(CrstStatic * pLock) |
76 | : m_pLock(pLock) |
77 | { |
78 | m_pLock->Enter(); |
79 | } |
80 | |
81 | ~CrstHolder() |
82 | { |
83 | m_pLock->Leave(); |
84 | } |
85 | }; |
86 | |
87 | class CrstHolderWithState |
88 | { |
89 | CrstStatic * m_pLock; |
90 | bool m_fAcquired; |
91 | |
92 | public: |
93 | CrstHolderWithState(CrstStatic * pLock, bool fAcquire = true) |
94 | : m_pLock(pLock), m_fAcquired(fAcquire) |
95 | { |
96 | if (fAcquire) |
97 | m_pLock->Enter(); |
98 | } |
99 | |
100 | ~CrstHolderWithState() |
101 | { |
102 | if (m_fAcquired) |
103 | m_pLock->Leave(); |
104 | } |
105 | |
106 | void Acquire() |
107 | { |
108 | if (!m_fAcquired) |
109 | { |
110 | m_pLock->Enter(); |
111 | m_fAcquired = true; |
112 | } |
113 | } |
114 | |
115 | void Release() |
116 | { |
117 | if (m_fAcquired) |
118 | { |
119 | m_pLock->Leave(); |
120 | m_fAcquired = false; |
121 | } |
122 | } |
123 | |
124 | CrstStatic * GetValue() |
125 | { |
126 | return m_pLock; |
127 | } |
128 | }; |
129 | |
130 | class CLREventStatic |
131 | { |
132 | public: |
133 | bool CreateAutoEventNoThrow(bool bInitialState); |
134 | bool CreateManualEventNoThrow(bool bInitialState); |
135 | bool CreateOSAutoEventNoThrow(bool bInitialState); |
136 | bool CreateOSManualEventNoThrow(bool bInitialState); |
137 | |
138 | void CloseEvent(); |
139 | bool IsValid() const; |
140 | bool Set(); |
141 | bool Reset(); |
142 | uint32_t Wait(uint32_t dwMilliseconds, bool bAlertable); |
143 | |
144 | private: |
145 | HANDLE m_hEvent; |
146 | bool m_fInitialized; |
147 | }; |
148 | |
149 | #endif // __GCENV_SYNC_H__ |
150 | |