@@ -36,7 +36,14 @@ typedef unsigned char BYTE;
3636typedef BYTE BOOLEAN;
3737typedef int BOOL;
3838typedef unsigned long DWORD;
39+ typedef long LONG;
3940typedef 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;
4047
4148typedef VOID (NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData);
4249
@@ -46,6 +53,11 @@ typedef PRTL_SRWLOCK PSRWLOCK;
4653typedef struct _RTL_CONDITION_VARIABLE *PRTL_CONDITION_VARIABLE;
4754typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE;
4855
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+
4961// These have to be #defines, to avoid problems with <windows.h>
5062#define RTL_SRWLOCK_INIT {0 }
5163#define SRWLOCK_INIT RTL_SRWLOCK_INIT
@@ -83,6 +95,19 @@ WINBASEAPI BOOL WINAPI SleepConditionVariableSRW(
8395 ULONG Flags
8496);
8597
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+
86111WINBASEAPI DWORD WINAPI FlsAlloc (PFLS_CALLBACK_FUNCTION lpCallback);
87112WINBASEAPI PVOID WINAPI FlsGetValue (DWORD dwFlsIndex);
88113WINBASEAPI BOOL WINAPI FlsSetValue (DWORD dwFlsIndex, PVOID lpFlsData);
@@ -140,6 +165,34 @@ inline BOOL SleepConditionVariableSRW(PSWIFT_CONDITION_VARIABLE CondVar,
140165 Flags);
141166}
142167
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+
143196} // namespace threading_impl
144197} // namespace swift
145198
0 commit comments