@@ -670,7 +670,11 @@ typedef struct __CFRunLoopMode *CFRunLoopModeRef;
670
670
671
671
struct __CFRunLoopMode {
672
672
CFRuntimeBase _base ;
673
+ #if DEPLOYMENT_TARGET_WINDOWS
674
+ CRITICAL_SECTION _lock ;
675
+ #else
673
676
CFLock_t _lock ; /* must have the run loop locked before locking this */
677
+ #endif
674
678
CFStringRef _name ;
675
679
Boolean _stopped ;
676
680
char _padding [3 ];
@@ -700,13 +704,21 @@ struct __CFRunLoopMode {
700
704
};
701
705
702
706
CF_INLINE void __CFRunLoopModeLock (CFRunLoopModeRef rlm ) {
707
+ #if DEPLOYMENT_TARGET_WINDOWS
708
+ EnterCriticalSection (& (rlm -> _lock ));
709
+ #else
703
710
__CFLock (& (rlm -> _lock ));
711
+ #endif
704
712
//CFLog(6, CFSTR("__CFRunLoopModeLock locked %p"), rlm);
705
713
}
706
714
707
715
CF_INLINE void __CFRunLoopModeUnlock (CFRunLoopModeRef rlm ) {
708
716
//CFLog(6, CFSTR("__CFRunLoopModeLock unlocking %p"), rlm);
717
+ #if DEPLOYMENT_TARGET_WINDOWS
718
+ LeaveCriticalSection (& (rlm -> _lock ));
719
+ #else
709
720
__CFUnlock (& (rlm -> _lock ));
721
+ #endif
710
722
}
711
723
712
724
static Boolean __CFRunLoopModeEqual (CFTypeRef cf1 , CFTypeRef cf2 ) {
@@ -740,6 +752,16 @@ static CFStringRef __CFRunLoopModeCopyDescription(CFTypeRef cf) {
740
752
return result ;
741
753
}
742
754
755
+ #if DEPLOYMENT_TARGET_WINDOWS
756
+ CF_INLINE void __CFRunLoopLockDestroy (LPCRITICAL_SECTION lpCS ) {
757
+ DeleteCritialSection (lpCS );
758
+ }
759
+ #else
760
+ CF_INLINE void __CFRunLoopLockDestroy (CFLock_t * lock ) {
761
+ pthread_mutex_destroy (lock );
762
+ }
763
+ #endif
764
+
743
765
static void __CFRunLoopModeDeallocate (CFTypeRef cf ) {
744
766
CFRunLoopModeRef rlm = (CFRunLoopModeRef )cf ;
745
767
if (NULL != rlm -> _sources0 ) CFRelease (rlm -> _sources0 );
@@ -761,7 +783,7 @@ static void __CFRunLoopModeDeallocate(CFTypeRef cf) {
761
783
#if USE_MK_TIMER_TOO
762
784
if (MACH_PORT_NULL != rlm -> _timerPort ) mk_timer_destroy (rlm -> _timerPort );
763
785
#endif
764
- pthread_mutex_destroy (& rlm -> _lock );
786
+ __CFRunLoopLockDestroy (& rlm -> _lock );
765
787
memset ((char * )cf + sizeof (CFRuntimeBase ), 0x7C , sizeof (struct __CFRunLoopMode ) - sizeof (CFRuntimeBase ));
766
788
}
767
789
@@ -783,7 +805,11 @@ typedef struct _per_run_data {
783
805
784
806
struct __CFRunLoop {
785
807
CFRuntimeBase _base ;
808
+ #if DEPLOYMENT_TARGET_WINDOWS
809
+ CRITICAL_SECTION _lock ;
810
+ #else
786
811
CFLock_t _lock ; /* locked for accessing mode list */
812
+ #endif
787
813
__CFPort _wakeUpPort ; // used for CFRunLoopWakeUp
788
814
Boolean _unused ;
789
815
volatile _per_run_data * _perRunData ; // reset for runs of the run loop
@@ -866,13 +892,21 @@ CF_INLINE void __CFRunLoopSetDeallocating(CFRunLoopRef rl) {
866
892
}
867
893
868
894
CF_INLINE void __CFRunLoopLock (CFRunLoopRef rl ) {
895
+ #if DEPLOYMENT_TARGET_WINDOWS
896
+ EnterCriticalSection (& (rl -> _lock ));
897
+ #else
869
898
__CFLock (& (((CFRunLoopRef )rl )-> _lock ));
899
+ #endif
870
900
// CFLog(6, CFSTR("__CFRunLoopLock locked %p"), rl);
871
901
}
872
902
873
903
CF_INLINE void __CFRunLoopUnlock (CFRunLoopRef rl ) {
874
904
// CFLog(6, CFSTR("__CFRunLoopLock unlocking %p"), rl);
905
+ #if DEPLOYMENT_TARGET_WINDOWS
906
+ LeaveCriticalSection (& (rl -> _lock ));
907
+ #else
875
908
__CFUnlock (& (((CFRunLoopRef )rl )-> _lock ));
909
+ #endif
876
910
}
877
911
878
912
static CFStringRef __CFRunLoopCopyDescription (CFTypeRef cf ) {
@@ -894,6 +928,11 @@ CF_PRIVATE void __CFRunLoopDump() { // __private_extern__ to keep the compiler f
894
928
CFRelease (desc );
895
929
}
896
930
931
+ #if DEPLOYMENT_TARGET_WINDOWS
932
+ CF_INLINE void __CFRunLoopLockInit (LPCRITICAL_SECTION lpCS ) {
933
+ InitializeCriticalSection (lpCS );
934
+ }
935
+ #else
897
936
CF_INLINE void __CFRunLoopLockInit (CFLock_t * lock ) {
898
937
pthread_mutexattr_t mattr ;
899
938
pthread_mutexattr_init (& mattr );
@@ -903,6 +942,7 @@ CF_INLINE void __CFRunLoopLockInit(CFLock_t *lock) {
903
942
if (0 != mret ) {
904
943
}
905
944
}
945
+ #endif
906
946
907
947
/* call with rl locked, returns mode locked */
908
948
static CFRunLoopModeRef __CFRunLoopFindMode (CFRunLoopRef rl , CFStringRef modeName , Boolean create ) {
@@ -1101,7 +1141,11 @@ CF_INLINE void __CFUnsetValid(void *cf) {
1101
1141
1102
1142
struct __CFRunLoopSource {
1103
1143
CFRuntimeBase _base ;
1144
+ #if DEPLOYMENT_TARGET_WINDOWS
1145
+ CRITICAL_SECTION _lock ;
1146
+ #else
1104
1147
CFLock_t _lock ;
1148
+ #endif
1105
1149
CFIndex _order ; /* immutable */
1106
1150
CFMutableBagRef _runLoops ;
1107
1151
union {
@@ -1124,20 +1168,32 @@ CF_INLINE void __CFRunLoopSourceUnsetSignaled(CFRunLoopSourceRef rls) {
1124
1168
}
1125
1169
1126
1170
CF_INLINE void __CFRunLoopSourceLock (CFRunLoopSourceRef rls ) {
1171
+ #if DEPLOYMENT_TARGET_WINDOWS
1172
+ EnterCriticalSection (& (rls -> _lock ));
1173
+ #else
1127
1174
__CFLock (& (rls -> _lock ));
1175
+ #endif
1128
1176
// CFLog(6, CFSTR("__CFRunLoopSourceLock locked %p"), rls);
1129
1177
}
1130
1178
1131
1179
CF_INLINE void __CFRunLoopSourceUnlock (CFRunLoopSourceRef rls ) {
1132
1180
// CFLog(6, CFSTR("__CFRunLoopSourceLock unlocking %p"), rls);
1181
+ #if DEPLOYMENT_TARGET_WINDOWS
1182
+ LeaveCriticalSection (& (rls -> _lock ));
1183
+ #else
1133
1184
__CFUnlock (& (rls -> _lock ));
1185
+ #endif
1134
1186
}
1135
1187
1136
1188
#pragma mark Observers
1137
1189
1138
1190
struct __CFRunLoopObserver {
1139
1191
CFRuntimeBase _base ;
1192
+ #if DEPLOYMENT_TARGET_WINDOWS
1193
+ CRITICAL_SECTION _lock ;
1194
+ #else
1140
1195
CFLock_t _lock ;
1196
+ #endif
1141
1197
CFRunLoopRef _runLoop ;
1142
1198
CFIndex _rlCount ;
1143
1199
CFOptionFlags _activities ; /* immutable */
@@ -1174,13 +1230,21 @@ CF_INLINE void __CFRunLoopObserverUnsetRepeats(CFRunLoopObserverRef rlo) {
1174
1230
}
1175
1231
1176
1232
CF_INLINE void __CFRunLoopObserverLock (CFRunLoopObserverRef rlo ) {
1233
+ #if DEPLOYMENT_TARGET_WINDOWS
1234
+ EnterCriticalSection (& (rlo -> _lock ));
1235
+ #else
1177
1236
__CFLock (& (rlo -> _lock ));
1237
+ #endif
1178
1238
// CFLog(6, CFSTR("__CFRunLoopObserverLock locked %p"), rlo);
1179
1239
}
1180
1240
1181
1241
CF_INLINE void __CFRunLoopObserverUnlock (CFRunLoopObserverRef rlo ) {
1182
1242
// CFLog(6, CFSTR("__CFRunLoopObserverLock unlocking %p"), rlo);
1243
+ #if DEPLOYMENT_TARGET_WINDOWS
1244
+ LeaveCriticalSection (& (rlo -> _lock ));
1245
+ #else
1183
1246
__CFUnlock (& (rlo -> _lock ));
1247
+ #endif
1184
1248
}
1185
1249
1186
1250
static void __CFRunLoopObserverSchedule (CFRunLoopObserverRef rlo , CFRunLoopRef rl , CFRunLoopModeRef rlm ) {
@@ -1206,7 +1270,11 @@ static void __CFRunLoopObserverCancel(CFRunLoopObserverRef rlo, CFRunLoopRef rl,
1206
1270
struct __CFRunLoopTimer {
1207
1271
CFRuntimeBase _base ;
1208
1272
uint16_t _bits ;
1273
+ #if DEPLOYMENT_TARGET_WINDOWS
1274
+ CRITICAL_SECTION _lock ;
1275
+ #else
1209
1276
CFLock_t _lock ;
1277
+ #endif
1210
1278
CFRunLoopRef _runLoop ;
1211
1279
CFMutableSetRef _rlModes ;
1212
1280
CFAbsoluteTime _nextFireDate ;
@@ -1243,13 +1311,21 @@ CF_INLINE void __CFRunLoopTimerSetDeallocating(CFRunLoopTimerRef rlt) {
1243
1311
}
1244
1312
1245
1313
CF_INLINE void __CFRunLoopTimerLock (CFRunLoopTimerRef rlt ) {
1314
+ #if DEPLOYMENT_TARGET_WINDOWS
1315
+ EnterCriticalSection (& (rlt -> _lock ));
1316
+ #else
1246
1317
__CFLock (& (rlt -> _lock ));
1318
+ #endif
1247
1319
// CFLog(6, CFSTR("__CFRunLoopTimerLock locked %p"), rlt);
1248
1320
}
1249
1321
1250
1322
CF_INLINE void __CFRunLoopTimerUnlock (CFRunLoopTimerRef rlt ) {
1251
1323
// CFLog(6, CFSTR("__CFRunLoopTimerLock unlocking %p"), rlt);
1324
+ #if DEPLOYMENT_TARGET_WINDOWS
1325
+ LeaveCriticalSection (& (rlt -> _lock ));
1326
+ #else
1252
1327
__CFUnlock (& (rlt -> _lock ));
1328
+ #endif
1253
1329
}
1254
1330
1255
1331
@@ -1427,7 +1503,7 @@ static void __CFRunLoopDeallocate(CFTypeRef cf) {
1427
1503
rl -> _wakeUpPort = CFPORT_NULL ;
1428
1504
__CFRunLoopPopPerRunData (rl , NULL );
1429
1505
__CFRunLoopUnlock (rl );
1430
- pthread_mutex_destroy (& rl -> _lock );
1506
+ __CFRunLoopLockDestroy (& rl -> _lock );
1431
1507
memset ((char * )cf + sizeof (CFRuntimeBase ), 0x8C , sizeof (struct __CFRunLoop ) - sizeof (CFRuntimeBase ));
1432
1508
}
1433
1509
@@ -1570,7 +1646,11 @@ CF_EXPORT CFRunLoopRef _CFRunLoopGet0(_CFThreadRef t) {
1570
1646
if (pthread_equal (t , pthread_self ())) {
1571
1647
_CFSetTSD (__CFTSDKeyRunLoop , (void * )loop , NULL );
1572
1648
if (0 == _CFGetTSD (__CFTSDKeyRunLoopCntr )) {
1649
+ #if _POSIX_THREADS
1573
1650
_CFSetTSD (__CFTSDKeyRunLoopCntr , (void * )(PTHREAD_DESTRUCTOR_ITERATIONS - 1 ), (void (* )(void * ))__CFFinalizeRunLoop );
1651
+ #elif DEPLOYMENT_TARGET_WINDOWS
1652
+ _CFSetTSD (__CFTSDKeyRunLoopCntr , (void * )0 , (void (* )(void * ))__CFFinalizeRunLoop );
1653
+ #endif
1574
1654
}
1575
1655
}
1576
1656
return loop ;
@@ -3748,7 +3828,7 @@ static void __CFRunLoopSourceDeallocate(CFTypeRef cf) { /* DOES CALLOUT */
3748
3828
if (rls -> _context .version0 .release ) {
3749
3829
rls -> _context .version0 .release (rls -> _context .version0 .info );
3750
3830
}
3751
- pthread_mutex_destroy (& rls -> _lock );
3831
+ __CFRunLoopLockDestroy (& rls -> _lock );
3752
3832
memset ((char * )cf + sizeof (CFRuntimeBase ), 0 , sizeof (struct __CFRunLoopSource ) - sizeof (CFRuntimeBase ));
3753
3833
}
3754
3834
@@ -3939,7 +4019,7 @@ static CFStringRef __CFRunLoopObserverCopyDescription(CFTypeRef cf) { /* DOES CA
3939
4019
static void __CFRunLoopObserverDeallocate (CFTypeRef cf ) { /* DOES CALLOUT */
3940
4020
CFRunLoopObserverRef rlo = (CFRunLoopObserverRef )cf ;
3941
4021
CFRunLoopObserverInvalidate (rlo );
3942
- pthread_mutex_destroy (& rlo -> _lock );
4022
+ __CFRunLoopLockDestroy (& rlo -> _lock );
3943
4023
}
3944
4024
3945
4025
const CFRuntimeClass __CFRunLoopObserverClass = {
@@ -4130,7 +4210,7 @@ static void __CFRunLoopTimerDeallocate(CFTypeRef cf) { /* DOES CALLOUT */
4130
4210
CFRunLoopTimerInvalidate (rlt ); /* DOES CALLOUT */
4131
4211
CFRelease (rlt -> _rlModes );
4132
4212
rlt -> _rlModes = NULL ;
4133
- pthread_mutex_destroy (& rlt -> _lock );
4213
+ __CFRunLoopLockDestroy (& rlt -> _lock );
4134
4214
}
4135
4215
4136
4216
const CFRuntimeClass __CFRunLoopTimerClass = {
0 commit comments