@@ -58,8 +58,10 @@ extern pthread_t pthread_main_thread_np(void);
5858typedef struct voucher_s * voucher_t ;
5959extern mach_port_t _dispatch_get_main_queue_port_4CF (void );
6060extern void _dispatch_main_queue_callback_4CF (mach_msg_header_t * msg );
61- #elif DEPLOYMENT_TARGET_WINDOWS
61+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
62+ #include <windows.h>
6263#include <process.h>
64+ #define DISPATCH_EXPORT extern
6365DISPATCH_EXPORT HANDLE _dispatch_get_main_queue_handle_4CF (void );
6466DISPATCH_EXPORT void _dispatch_main_queue_callback_4CF (void * );
6567
@@ -68,9 +70,11 @@ DISPATCH_EXPORT void _dispatch_main_queue_callback_4CF(void*);
6870#define mach_port_t HANDLE
6971#define _dispatch_get_main_queue_port_4CF _dispatch_get_main_queue_handle_4CF
7072
71- #define AbsoluteTime LARGE_INTEGER
73+ #define LARGE_INTEGER uint64_t
7274
7375#elif DEPLOYMENT_TARGET_LINUX
76+ #if TARGET_OS_CYGWIN
77+ #else
7478#include <dlfcn.h>
7579#include <poll.h>
7680#include <sys/epoll.h>
@@ -79,6 +83,7 @@ DISPATCH_EXPORT void _dispatch_main_queue_callback_4CF(void*);
7983
8084#define _dispatch_get_main_queue_port_4CF _dispatch_get_main_queue_handle_4CF
8185#endif
86+ #endif
8287
8388#if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_IPHONESIMULATOR || DEPLOYMENT_TARGET_LINUX
8489CF_EXPORT pthread_t _CF_pthread_main_thread_np (void );
@@ -347,7 +352,7 @@ CF_INLINE void __CFPortSetFree(__CFPortSet portSet) {
347352 }
348353}
349354
350- #elif DEPLOYMENT_TARGET_WINDOWS
355+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
351356
352357typedef HANDLE __CFPort ;
353358#define CFPORT_NULL NULL
@@ -373,6 +378,8 @@ static __CFPortSet __CFPortSetAllocate(void) {
373378 result -> used = 0 ;
374379 result -> size = 4 ;
375380 result -> handles = (HANDLE * )CFAllocatorAllocate (kCFAllocatorSystemDefault , result -> size * sizeof (HANDLE ), 0 );
381+
382+ #define CF_SPINLOCK_INIT_FOR_STRUCTS (X ) InitializeCriticalSection(&X)
376383 CF_SPINLOCK_INIT_FOR_STRUCTS (result -> lock );
377384 return result ;
378385}
@@ -522,7 +529,7 @@ static uint32_t __CFSendTrivialMachMessage(mach_port_t port, uint32_t msg_id, CF
522529 if (result == MACH_SEND_TIMED_OUT ) mach_msg_destroy (& header );
523530 return result ;
524531}
525- #elif DEPLOYMENT_TARGET_LINUX
532+ #elif DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN
526533
527534static int mk_timer_create (void ) {
528535 return timerfd_create (CLOCK_MONOTONIC , TFD_NONBLOCK |TFD_CLOEXEC );
@@ -552,7 +559,7 @@ CF_INLINE int64_t __CFUInt64ToAbsoluteTime(int64_t x) {
552559 return x ;
553560}
554561
555- #elif DEPLOYMENT_TARGET_WINDOWS
562+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
556563
557564static HANDLE mk_timer_create (void ) {
558565 return CreateWaitableTimer (NULL , FALSE, NULL );
@@ -572,13 +579,13 @@ static kern_return_t mk_timer_arm(HANDLE name, LARGE_INTEGER expire_time) {
572579 // There is a race we know about here, (timer fire time calculated -> thread suspended -> timer armed == late timer fire), but we don't have a way to avoid it at this time, since the only way to specify an absolute value to the timer is to calculate the relative time first. Fixing that would probably require not using the TSR for timers on Windows.
573580 uint64_t now = mach_absolute_time ();
574581 if (now > expire_time ) {
575- result . QuadPart = 0 ;
582+ result = 0 ;
576583 } else {
577584 uint64_t timeDiff = expire_time - now ;
578585 CFTimeInterval amountOfTimeToWait = __CFTSRToTimeInterval (timeDiff );
579586 // Result is in 100 ns (10**-7 sec) units to be consistent with a FILETIME.
580587 // CFTimeInterval is in seconds.
581- result . QuadPart = - (amountOfTimeToWait * 10000000 );
588+ result = - (amountOfTimeToWait * 10000000 );
582589 }
583590
584591 BOOL res = SetWaitableTimer (name , & result , 0 , NULL , NULL , FALSE);
@@ -2355,7 +2362,7 @@ static Boolean __CFRunLoopServiceMachPort(mach_port_name_t port, mach_msg_header
23552362 return false;
23562363}
23572364
2358- #elif DEPLOYMENT_TARGET_LINUX
2365+ #elif DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN
23592366
23602367#define TIMEOUT_INFINITY UINT64_MAX
23612368
@@ -2444,7 +2451,7 @@ static Boolean __CFRunLoopServiceFileDescriptors(__CFPortSet portSet, __CFPort o
24442451 return true;
24452452}
24462453
2447- #elif DEPLOYMENT_TARGET_WINDOWS
2454+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
24482455
24492456#define TIMEOUT_INFINITY INFINITE
24502457
@@ -2594,7 +2601,7 @@ static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, CFTimeInter
25942601#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI
25952602 mach_msg_header_t * msg = NULL ;
25962603 mach_port_t livePort = MACH_PORT_NULL ;
2597- #elif DEPLOYMENT_TARGET_WINDOWS
2604+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
25982605 HANDLE livePort = NULL ;
25992606 Boolean windowsMessageReceived = false;
26002607#elif DEPLOYMENT_TARGET_LINUX
@@ -2623,11 +2630,11 @@ static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, CFTimeInter
26232630 if (__CFRunLoopServiceMachPort (dispatchPort , & msg , sizeof (msg_buffer ), & livePort , 0 , & voucherState , NULL )) {
26242631 goto handle_msg ;
26252632 }
2626- #elif DEPLOYMENT_TARGET_LINUX
2633+ #elif DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN
26272634 if (__CFRunLoopServiceFileDescriptors (CFPORTSET_NULL , dispatchPort , 0 , & livePort )) {
26282635 goto handle_msg ;
26292636 }
2630- #elif DEPLOYMENT_TARGET_WINDOWS
2637+ #elif DEPLOYMENT_TARGET_WINDOWS || TARGET_OS_CYGWIN
26312638 if (__CFRunLoopWaitForMultipleObjects (NULL , & dispatchPort , 0 , 0 , & livePort , NULL )) {
26322639 goto handle_msg ;
26332640 }
@@ -2695,7 +2702,7 @@ static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, CFTimeInter
26952702#elif DEPLOYMENT_TARGET_WINDOWS
26962703 // Here, use the app-supplied message queue mask. They will set this if they are interested in having this run loop receive windows messages.
26972704 __CFRunLoopWaitForMultipleObjects (waitSet , NULL , poll ? 0 : TIMEOUT_INFINITY , rlm -> _msgQMask , & livePort , & windowsMessageReceived );
2698- #elif DEPLOYMENT_TARGET_LINUX
2705+ #elif DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN
26992706 __CFRunLoopServiceFileDescriptors (waitSet , CFPORT_NULL , TIMEOUT_INFINITY , & livePort );
27002707#endif
27012708
@@ -2820,7 +2827,7 @@ static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, CFTimeInter
28202827 (void )mach_msg (reply , MACH_SEND_MSG , reply -> msgh_size , 0 , MACH_PORT_NULL , 0 , MACH_PORT_NULL );
28212828 CFAllocatorDeallocate (kCFAllocatorSystemDefault , reply );
28222829 }
2823- #elif DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX
2830+ #elif DEPLOYMENT_TARGET_WINDOWS || ( DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN )
28242831 sourceHandledThisLoop = __CFRunLoopDoSource1 (rl , rlm , rls ) || sourceHandledThisLoop ;
28252832#endif
28262833 }
@@ -2936,7 +2943,7 @@ void CFRunLoopWakeUp(CFRunLoopRef rl) {
29362943 * wakeup pending, since the queue length is 1. */
29372944 ret = __CFSendTrivialMachMessage (rl -> _wakeUpPort , 0 , MACH_SEND_TIMEOUT , 0 );
29382945 if (ret != MACH_MSG_SUCCESS && ret != MACH_SEND_TIMED_OUT ) CRASH ("*** Unable to send message to wake up port. (%d) ***" , ret );
2939- #elif DEPLOYMENT_TARGET_LINUX
2946+ #elif DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN
29402947 int ret ;
29412948 do {
29422949 ret = eventfd_write (rl -> _wakeUpPort , 1 );
@@ -3481,7 +3488,7 @@ static CFStringRef __CFRunLoopSourceCopyDescription(CFTypeRef cf) { /* DOES CALL
34813488 void * addr = rls -> _context .version0 .version == 0 ? (void * )rls -> _context .version0 .perform : (rls -> _context .version0 .version == 1 ? (void * )rls -> _context .version1 .perform : NULL );
34823489#if DEPLOYMENT_TARGET_WINDOWS
34833490 contextDesc = CFStringCreateWithFormat (kCFAllocatorSystemDefault , NULL , CFSTR ("<CFRunLoopSource context>{version = %ld, info = %p, callout = %p}" ), rls -> _context .version0 .version , rls -> _context .version0 .info , addr );
3484- #elif DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX
3491+ #elif DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || ( DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN )
34853492 Dl_info info ;
34863493 const char * name = (dladdr (addr , & info ) && info .dli_saddr == addr && info .dli_sname ) ? info .dli_sname : "???" ;
34873494 contextDesc = CFStringCreateWithFormat (kCFAllocatorSystemDefault , NULL , CFSTR ("<CFRunLoopSource context>{version = %ld, info = %p, callout = %s (%p)}" ), rls -> _context .version0 .version , rls -> _context .version0 .info , name , addr );
@@ -3682,7 +3689,7 @@ static CFStringRef __CFRunLoopObserverCopyDescription(CFTypeRef cf) { /* DOES CA
36823689 }
36833690#if DEPLOYMENT_TARGET_WINDOWS
36843691 result = CFStringCreateWithFormat (kCFAllocatorSystemDefault , NULL , CFSTR ("<CFRunLoopObserver %p [%p]>{valid = %s, activities = 0x%x, repeats = %s, order = %d, callout = %p, context = %@}" ), cf , CFGetAllocator (rlo ), __CFIsValid (rlo ) ? "Yes" : "No" , rlo -> _activities , __CFRunLoopObserverRepeats (rlo ) ? "Yes" : "No" , rlo -> _order , rlo -> _callout , contextDesc );
3685- #elif DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX
3692+ #elif DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || ( DEPLOYMENT_TARGET_LINUX && ! TARGET_OS_CYGWIN )
36863693 void * addr = rlo -> _callout ;
36873694 Dl_info info ;
36883695 const char * name = (dladdr (addr , & info ) && info .dli_saddr == addr && info .dli_sname ) ? info .dli_sname : "???" ;
0 commit comments