Skip to content

Commit da2b3c9

Browse files
committed
RunLoop: replace CFLock_t with CRITICAL_SECTION
Replace CFLock_t with CRITICAL_SECTION on Windows for the RunLoops. The runloops require a recursive mutex which cannot be fulfilled with SRWLOCKs, so we need to replace the locks on Windows. Ideally, we would create a CFRecusiveLock_t.
1 parent d76d890 commit da2b3c9

File tree

2 files changed

+85
-8
lines changed

2 files changed

+85
-8
lines changed

CoreFoundation/Base.subproj/CFInternal.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,6 @@ typedef struct os_log_s *os_log_t;
147147
#ifndef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER
148148
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {_PTHREAD_ERRORCHECK_MUTEX_SIG_init, {0}}
149149
#endif
150-
#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
151-
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {_PTHREAD_RECURSIVE_MUTEX_SIG_init, {0}}
152-
#endif
153150
#endif
154151

155152
#if defined(__BIG_ENDIAN__)

CoreFoundation/RunLoop.subproj/CFRunLoop.c

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,11 @@ typedef struct __CFRunLoopMode *CFRunLoopModeRef;
654654

655655
struct __CFRunLoopMode {
656656
CFRuntimeBase _base;
657+
#if DEPLOYMENT_TARGET_WINDOWS
658+
CRITICAL_SECTION _lock;
659+
#else
657660
CFLock_t _lock; /* must have the run loop locked before locking this */
661+
#endif
658662
CFStringRef _name;
659663
Boolean _stopped;
660664
char _padding[3];
@@ -684,13 +688,21 @@ struct __CFRunLoopMode {
684688
};
685689

686690
CF_INLINE void __CFRunLoopModeLock(CFRunLoopModeRef rlm) {
691+
#if DEPLOYMENT_TARGET_WINDOWS
692+
EnterCriticalSection(&(rlm->_lock));
693+
#else
687694
__CFLock(&(rlm->_lock));
695+
#endif
688696
//CFLog(6, CFSTR("__CFRunLoopModeLock locked %p"), rlm);
689697
}
690698

691699
CF_INLINE void __CFRunLoopModeUnlock(CFRunLoopModeRef rlm) {
692700
//CFLog(6, CFSTR("__CFRunLoopModeLock unlocking %p"), rlm);
701+
#if DEPLOYMENT_TARGET_WINDOWS
702+
LeaveCriticalSection(&(rlm->_lock));
703+
#else
693704
__CFUnlock(&(rlm->_lock));
705+
#endif
694706
}
695707

696708
static Boolean __CFRunLoopModeEqual(CFTypeRef cf1, CFTypeRef cf2) {
@@ -724,6 +736,16 @@ static CFStringRef __CFRunLoopModeCopyDescription(CFTypeRef cf) {
724736
return result;
725737
}
726738

739+
#if DEPLOYMENT_TARGET_WINDOWS
740+
CF_INLINE void __CFRunLoopLockDestroy(LPCRITICAL_SECTION lpCS) {
741+
DeleteCritialSection(lpCS);
742+
}
743+
#else
744+
CF_INLINE void __CFRunLoopLockDestroy(CFLock_t *lock) {
745+
pthread_mutex_destroy(lock);
746+
}
747+
#endif
748+
727749
static void __CFRunLoopModeDeallocate(CFTypeRef cf) {
728750
CFRunLoopModeRef rlm = (CFRunLoopModeRef)cf;
729751
if (NULL != rlm->_sources0) CFRelease(rlm->_sources0);
@@ -745,7 +767,7 @@ static void __CFRunLoopModeDeallocate(CFTypeRef cf) {
745767
#if USE_MK_TIMER_TOO
746768
if (MACH_PORT_NULL != rlm->_timerPort) mk_timer_destroy(rlm->_timerPort);
747769
#endif
748-
pthread_mutex_destroy(&rlm->_lock);
770+
__CFRunLoopLockDestroy(&rlm->_lock);
749771
memset((char *)cf + sizeof(CFRuntimeBase), 0x7C, sizeof(struct __CFRunLoopMode) - sizeof(CFRuntimeBase));
750772
}
751773

@@ -767,7 +789,11 @@ typedef struct _per_run_data {
767789

768790
struct __CFRunLoop {
769791
CFRuntimeBase _base;
792+
#if DEPLOYMENT_TARGET_WINDOWS
793+
CRITICAL_SECTION _lock;
794+
#else
770795
CFLock_t _lock; /* locked for accessing mode list */
796+
#endif
771797
__CFPort _wakeUpPort; // used for CFRunLoopWakeUp
772798
Boolean _unused;
773799
volatile _per_run_data *_perRunData; // reset for runs of the run loop
@@ -850,13 +876,21 @@ CF_INLINE void __CFRunLoopSetDeallocating(CFRunLoopRef rl) {
850876
}
851877

852878
CF_INLINE void __CFRunLoopLock(CFRunLoopRef rl) {
879+
#if DEPLOYMENT_TARGET_WINDOWS
880+
EnterCriticalSection(&(rl->_lock));
881+
#else
853882
__CFLock(&(((CFRunLoopRef)rl)->_lock));
883+
#endif
854884
// CFLog(6, CFSTR("__CFRunLoopLock locked %p"), rl);
855885
}
856886

857887
CF_INLINE void __CFRunLoopUnlock(CFRunLoopRef rl) {
858888
// CFLog(6, CFSTR("__CFRunLoopLock unlocking %p"), rl);
889+
#if DEPLOYMENT_TARGET_WINDOWS
890+
LeaveCriticalSection(&(rl->_lock));
891+
#else
859892
__CFUnlock(&(((CFRunLoopRef)rl)->_lock));
893+
#endif
860894
}
861895

862896
static CFStringRef __CFRunLoopCopyDescription(CFTypeRef cf) {
@@ -878,6 +912,11 @@ CF_PRIVATE void __CFRunLoopDump() { // __private_extern__ to keep the compiler f
878912
CFRelease(desc);
879913
}
880914

915+
#if DEPLOYMENT_TARGET_WINDOWS
916+
CF_INLINE void __CFRunLoopLockInit(LPCRITICAL_SECTION lpCS) {
917+
InitializeCriticalSection(lpCS);
918+
}
919+
#else
881920
CF_INLINE void __CFRunLoopLockInit(CFLock_t *lock) {
882921
pthread_mutexattr_t mattr;
883922
pthread_mutexattr_init(&mattr);
@@ -887,6 +926,7 @@ CF_INLINE void __CFRunLoopLockInit(CFLock_t *lock) {
887926
if (0 != mret) {
888927
}
889928
}
929+
#endif
890930

891931
/* call with rl locked, returns mode locked */
892932
static CFRunLoopModeRef __CFRunLoopFindMode(CFRunLoopRef rl, CFStringRef modeName, Boolean create) {
@@ -1085,7 +1125,11 @@ CF_INLINE void __CFUnsetValid(void *cf) {
10851125

10861126
struct __CFRunLoopSource {
10871127
CFRuntimeBase _base;
1128+
#if DEPLOYMENT_TARGET_WINDOWS
1129+
CRITICAL_SECTION _lock;
1130+
#else
10881131
CFLock_t _lock;
1132+
#endif
10891133
CFIndex _order; /* immutable */
10901134
CFMutableBagRef _runLoops;
10911135
union {
@@ -1108,20 +1152,32 @@ CF_INLINE void __CFRunLoopSourceUnsetSignaled(CFRunLoopSourceRef rls) {
11081152
}
11091153

11101154
CF_INLINE void __CFRunLoopSourceLock(CFRunLoopSourceRef rls) {
1155+
#if DEPLOYMENT_TARGET_WINDOWS
1156+
EnterCriticalSection(&(rls->_lock));
1157+
#else
11111158
__CFLock(&(rls->_lock));
1159+
#endif
11121160
// CFLog(6, CFSTR("__CFRunLoopSourceLock locked %p"), rls);
11131161
}
11141162

11151163
CF_INLINE void __CFRunLoopSourceUnlock(CFRunLoopSourceRef rls) {
11161164
// CFLog(6, CFSTR("__CFRunLoopSourceLock unlocking %p"), rls);
1165+
#if DEPLOYMENT_TARGET_WINDOWS
1166+
LeaveCriticalSection(&(rls->_lock));
1167+
#else
11171168
__CFUnlock(&(rls->_lock));
1169+
#endif
11181170
}
11191171

11201172
#pragma mark Observers
11211173

11221174
struct __CFRunLoopObserver {
11231175
CFRuntimeBase _base;
1176+
#if DEPLOYMENT_TARGET_WINDOWS
1177+
CRITICAL_SECTION _lock;
1178+
#else
11241179
CFLock_t _lock;
1180+
#endif
11251181
CFRunLoopRef _runLoop;
11261182
CFIndex _rlCount;
11271183
CFOptionFlags _activities; /* immutable */
@@ -1158,13 +1214,21 @@ CF_INLINE void __CFRunLoopObserverUnsetRepeats(CFRunLoopObserverRef rlo) {
11581214
}
11591215

11601216
CF_INLINE void __CFRunLoopObserverLock(CFRunLoopObserverRef rlo) {
1217+
#if DEPLOYMENT_TARGET_WINDOWS
1218+
EnterCriticalSection(&(rlo->_lock));
1219+
#else
11611220
__CFLock(&(rlo->_lock));
1221+
#endif
11621222
// CFLog(6, CFSTR("__CFRunLoopObserverLock locked %p"), rlo);
11631223
}
11641224

11651225
CF_INLINE void __CFRunLoopObserverUnlock(CFRunLoopObserverRef rlo) {
11661226
// CFLog(6, CFSTR("__CFRunLoopObserverLock unlocking %p"), rlo);
1227+
#if DEPLOYMENT_TARGET_WINDOWS
1228+
LeaveCriticalSection(&(rlo->_lock));
1229+
#else
11671230
__CFUnlock(&(rlo->_lock));
1231+
#endif
11681232
}
11691233

11701234
static void __CFRunLoopObserverSchedule(CFRunLoopObserverRef rlo, CFRunLoopRef rl, CFRunLoopModeRef rlm) {
@@ -1190,7 +1254,11 @@ static void __CFRunLoopObserverCancel(CFRunLoopObserverRef rlo, CFRunLoopRef rl,
11901254
struct __CFRunLoopTimer {
11911255
CFRuntimeBase _base;
11921256
uint16_t _bits;
1257+
#if DEPLOYMENT_TARGET_WINDOWS
1258+
CRITICAL_SECTION _lock;
1259+
#else
11931260
CFLock_t _lock;
1261+
#endif
11941262
CFRunLoopRef _runLoop;
11951263
CFMutableSetRef _rlModes;
11961264
CFAbsoluteTime _nextFireDate;
@@ -1227,13 +1295,21 @@ CF_INLINE void __CFRunLoopTimerSetDeallocating(CFRunLoopTimerRef rlt) {
12271295
}
12281296

12291297
CF_INLINE void __CFRunLoopTimerLock(CFRunLoopTimerRef rlt) {
1298+
#if DEPLOYMENT_TARGET_WINDOWS
1299+
EnterCriticalSection(&(rlt->_lock));
1300+
#else
12301301
__CFLock(&(rlt->_lock));
1302+
#endif
12311303
// CFLog(6, CFSTR("__CFRunLoopTimerLock locked %p"), rlt);
12321304
}
12331305

12341306
CF_INLINE void __CFRunLoopTimerUnlock(CFRunLoopTimerRef rlt) {
12351307
// CFLog(6, CFSTR("__CFRunLoopTimerLock unlocking %p"), rlt);
1308+
#if DEPLOYMENT_TARGET_WINDOWS
1309+
LeaveCriticalSection(&(rlt->_lock));
1310+
#else
12361311
__CFUnlock(&(rlt->_lock));
1312+
#endif
12371313
}
12381314

12391315

@@ -1411,7 +1487,7 @@ static void __CFRunLoopDeallocate(CFTypeRef cf) {
14111487
rl->_wakeUpPort = CFPORT_NULL;
14121488
__CFRunLoopPopPerRunData(rl, NULL);
14131489
__CFRunLoopUnlock(rl);
1414-
pthread_mutex_destroy(&rl->_lock);
1490+
__CFRunLoopLockDestroy(&rl->_lock);
14151491
memset((char *)cf + sizeof(CFRuntimeBase), 0x8C, sizeof(struct __CFRunLoop) - sizeof(CFRuntimeBase));
14161492
}
14171493

@@ -1554,7 +1630,11 @@ CF_EXPORT CFRunLoopRef _CFRunLoopGet0(_CFThreadRef t) {
15541630
if (pthread_equal(t, pthread_self())) {
15551631
_CFSetTSD(__CFTSDKeyRunLoop, (void *)loop, NULL);
15561632
if (0 == _CFGetTSD(__CFTSDKeyRunLoopCntr)) {
1633+
#if _POSIX_THREADS
15571634
_CFSetTSD(__CFTSDKeyRunLoopCntr, (void *)(PTHREAD_DESTRUCTOR_ITERATIONS-1), (void (*)(void *))__CFFinalizeRunLoop);
1635+
#elif DEPLOYMENT_TARGET_WINDOWS
1636+
_CFSetTSD(__CFTSDKeyRunLoopCntr, (void *)0, (void (*)(void *))__CFFinalizeRunLoop);
1637+
#endif
15581638
}
15591639
}
15601640
return loop;
@@ -3732,7 +3812,7 @@ static void __CFRunLoopSourceDeallocate(CFTypeRef cf) { /* DOES CALLOUT */
37323812
if (rls->_context.version0.release) {
37333813
rls->_context.version0.release(rls->_context.version0.info);
37343814
}
3735-
pthread_mutex_destroy(&rls->_lock);
3815+
__CFRunLoopLockDestroy(&rls->_lock);
37363816
memset((char *)cf + sizeof(CFRuntimeBase), 0, sizeof(struct __CFRunLoopSource) - sizeof(CFRuntimeBase));
37373817
}
37383818

@@ -3923,7 +4003,7 @@ static CFStringRef __CFRunLoopObserverCopyDescription(CFTypeRef cf) { /* DOES CA
39234003
static void __CFRunLoopObserverDeallocate(CFTypeRef cf) { /* DOES CALLOUT */
39244004
CFRunLoopObserverRef rlo = (CFRunLoopObserverRef)cf;
39254005
CFRunLoopObserverInvalidate(rlo);
3926-
pthread_mutex_destroy(&rlo->_lock);
4006+
__CFRunLoopLockDestroy(&rlo->_lock);
39274007
}
39284008

39294009
const CFRuntimeClass __CFRunLoopObserverClass = {
@@ -4114,7 +4194,7 @@ static void __CFRunLoopTimerDeallocate(CFTypeRef cf) { /* DOES CALLOUT */
41144194
CFRunLoopTimerInvalidate(rlt); /* DOES CALLOUT */
41154195
CFRelease(rlt->_rlModes);
41164196
rlt->_rlModes = NULL;
4117-
pthread_mutex_destroy(&rlt->_lock);
4197+
__CFRunLoopLockDestroy(&rlt->_lock);
41184198
}
41194199

41204200
const CFRuntimeClass __CFRunLoopTimerClass = {

0 commit comments

Comments
 (0)