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