@@ -43,6 +43,9 @@ import SwiftPrivateThreadExtras
4343import Darwin
4444#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku)
4545import Glibc
46+ #elseif os(Windows)
47+ import MSVCRT
48+ import WinSDK
4649#endif
4750
4851#if _runtime(_ObjC)
@@ -508,6 +511,36 @@ func _workerThreadOneTrial<RT>(
508511}
509512
510513/// One-shot sleep in one thread, allowing interrupt by another.
514+ #if os(Windows)
515+ class _InterruptibleSleep {
516+ let event : HANDLE ?
517+ var completed : Bool = false
518+
519+ init ( ) {
520+ self . event = CreateEventW ( nil , TRUE, FALSE, nil )
521+ precondition ( self . event != nil )
522+ }
523+
524+ deinit {
525+ CloseHandle ( self . event)
526+ }
527+
528+ func sleep( durationInSeconds duration: Int ) {
529+ guard completed == false else { return }
530+
531+ let result : DWORD = WaitForSingleObject ( event, DWORD ( duration * 1000 ) )
532+ precondition ( result == WAIT_OBJECT_0)
533+
534+ completed = true
535+ }
536+
537+ func wake( ) {
538+ guard completed == false else { return }
539+ let result : BOOL = SetEvent ( self . event)
540+ precondition ( result == TRUE)
541+ }
542+ }
543+ #else
511544class _InterruptibleSleep {
512545 let writeEnd : CInt
513546 let readEnd : CInt
@@ -550,6 +583,13 @@ class _InterruptibleSleep {
550583 precondition ( ret >= 0 )
551584 }
552585}
586+ #endif
587+
588+ #if os(Windows)
589+ typealias ThreadHandle = HANDLE
590+ #else
591+ typealias ThreadHandle = pthread_t
592+ #endif
553593
554594public func runRaceTest< RT : RaceTestWithPerTrialData > (
555595 _: RT . Type ,
@@ -600,8 +640,8 @@ public func runRaceTest<RT : RaceTestWithPerTrialData>(
600640 _ = timeoutReached. fetchAndAdd ( 1 )
601641 }
602642
603- var testTids = [ pthread_t ] ( )
604- var alarmTid : pthread_t
643+ var testTids = [ ThreadHandle ] ( )
644+ var alarmTid : ThreadHandle
605645
606646 // Create the master thread.
607647 do {
0 commit comments