@@ -36,7 +36,10 @@ typedef unsigned char BYTE;
3636typedef BYTE BOOLEAN;
3737typedef int BOOL;
3838typedef unsigned long DWORD;
39+ typedef long LONG;
3940typedef unsigned long ULONG;
41+ typedef unsigned long ULONG_PTR;
42+ typedef PVOID HANDLE;
4043
4144typedef VOID (NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData);
4245
@@ -46,6 +49,11 @@ typedef PRTL_SRWLOCK PSRWLOCK;
4649typedef struct _RTL_CONDITION_VARIABLE *PRTL_CONDITION_VARIABLE;
4750typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE;
4851
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+
4957// These have to be #defines, to avoid problems with <windows.h>
5058#define RTL_SRWLOCK_INIT {0 }
5159#define SRWLOCK_INIT RTL_SRWLOCK_INIT
@@ -83,6 +91,19 @@ WINBASEAPI BOOL WINAPI SleepConditionVariableSRW(
8391 ULONG Flags
8492);
8593
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+
86107WINBASEAPI DWORD WINAPI FlsAlloc (PFLS_CALLBACK_FUNCTION lpCallback);
87108WINBASEAPI PVOID WINAPI FlsGetValue (DWORD dwFlsIndex);
88109WINBASEAPI BOOL WINAPI FlsSetValue (DWORD dwFlsIndex, PVOID lpFlsData);
@@ -140,6 +161,34 @@ inline BOOL SleepConditionVariableSRW(PSWIFT_CONDITION_VARIABLE CondVar,
140161 Flags);
141162}
142163
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+
143192} // namespace threading_impl
144193} // namespace swift
145194
0 commit comments