@@ -36,7 +36,10 @@ typedef unsigned char BYTE;
36
36
typedef BYTE BOOLEAN;
37
37
typedef int BOOL;
38
38
typedef unsigned long DWORD;
39
+ typedef long LONG;
39
40
typedef unsigned long ULONG;
41
+ typedef unsigned long ULONG_PTR;
42
+ typedef PVOID HANDLE;
40
43
41
44
typedef VOID (NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData);
42
45
@@ -46,6 +49,11 @@ typedef PRTL_SRWLOCK PSRWLOCK;
46
49
typedef struct _RTL_CONDITION_VARIABLE *PRTL_CONDITION_VARIABLE;
47
50
typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE;
48
51
52
+ typedef struct _RTL_CRITICAL_SECTION_DEBUG *PRTL_CRITICAL_SECTION_DEBUG;
53
+ typedef struct _RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION;
54
+ typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
55
+ typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;
56
+
49
57
// These have to be #defines, to avoid problems with <windows.h>
50
58
#define RTL_SRWLOCK_INIT {0 }
51
59
#define SRWLOCK_INIT RTL_SRWLOCK_INIT
@@ -83,6 +91,19 @@ WINBASEAPI BOOL WINAPI SleepConditionVariableSRW(
83
91
ULONG Flags
84
92
);
85
93
94
+ WINBASEAPI VOID WINAPI InitializeCriticalSection (
95
+ LPCRITICAL_SECTION lpCriticalSection
96
+ );
97
+ WINBASEAPI VOID WINAPI DeleteCriticalSection (
98
+ LPCRITICAL_SECTION lpCriticalSection
99
+ );
100
+ WINBASEAPI VOID WINAPI EnterCriticalSection (
101
+ LPCRITICAL_SECTION lpCriticalSection
102
+ );
103
+ WINBASEAPI VOID WINAPI LeaveCriticalSection (
104
+ LPCRITICAL_SECTION lpCriticalSection
105
+ );
106
+
86
107
WINBASEAPI DWORD WINAPI FlsAlloc (PFLS_CALLBACK_FUNCTION lpCallback);
87
108
WINBASEAPI PVOID WINAPI FlsGetValue (DWORD dwFlsIndex);
88
109
WINBASEAPI BOOL WINAPI FlsSetValue (DWORD dwFlsIndex, PVOID lpFlsData);
@@ -140,6 +161,34 @@ inline BOOL SleepConditionVariableSRW(PSWIFT_CONDITION_VARIABLE CondVar,
140
161
Flags);
141
162
}
142
163
164
+ // And with CRITICAL_SECTION
165
+ #pragma pack(push, 8)
166
+ typedef struct SWIFT_CRITICAL_SECTION {
167
+ PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
168
+ LONG LockCount;
169
+ LONG RecursionCount;
170
+ HANDLE OwningThread;
171
+ HANDLE LockSemaphore;
172
+ ULONG_PTR SpinCount;
173
+ } SWIFT_CRITICAL_SECTION, *PSWIFT_CRITICAL_SECTION;
174
+ #pragma pack(pop)
175
+
176
+ inline VOID InitializeCriticalSection (PSWIFT_CRITICAL_SECTION CritSec) {
177
+ ::InitializeCriticalSection (reinterpret_cast <LPCRITICAL_SECTION>(CritSec));
178
+ }
179
+
180
+ inline VOID DeleteCriticalSection (PSWIFT_CRITICAL_SECTION CritSec) {
181
+ ::DeleteCriticalSection (reinterpret_cast <LPCRITICAL_SECTION>(CritSec));
182
+ }
183
+
184
+ inline VOID EnterCriticalSection (PSWIFT_CRITICAL_SECTION CritSec) {
185
+ ::EnterCriticalSection (reinterpret_cast <LPCRITICAL_SECTION>(CritSec));
186
+ }
187
+
188
+ inline VOID LeaveCriticalSection (PSWIFT_CRITICAL_SECTION CritSec) {
189
+ ::LeaveCriticalSection (reinterpret_cast <LPCRITICAL_SECTION>(CritSec));
190
+ }
191
+
143
192
} // namespace threading_impl
144
193
} // namespace swift
145
194
0 commit comments