+static void __CFRunLoopRemoveSourcesFromCommonMode(const void *value, void *ctx) {
+ CFStringRef modeName = (CFStringRef)value;
+ CFRunLoopRef rl = (CFRunLoopRef)ctx;
+ __CFRunLoopRemoveAllSources(rl, modeName);
+}
+
+static void __CFRunLoopRemoveSourceFromMode(const void *value, void *ctx) {
+ CFRunLoopSourceRef rls = (CFRunLoopSourceRef)value;
+ CFRunLoopRef rl = (CFRunLoopRef)(((CFTypeRef *)ctx)[0]);
+ CFStringRef modeName = (CFStringRef)(((CFTypeRef *)ctx)[1]);
+ CFRunLoopRemoveSource(rl, rls, modeName);
+}
+
+static void __CFRunLoopRemoveAllSources(CFRunLoopRef rl, CFStringRef modeName) {
+ CHECK_FOR_FORK();
+ CFRunLoopModeRef rlm;
+ __CFRunLoopLock(rl);
+ if (modeName == kCFRunLoopCommonModes) {
+ if (NULL != rl->_commonModeItems) {
+ CFSetRef set = rl->_commonModes ? CFSetCreateCopy(kCFAllocatorSystemDefault, rl->_commonModes) : NULL;
+ __CFRunLoopUnlock(rl);
+ if (NULL != set) {
+ CFSetApplyFunction(set, (__CFRunLoopRemoveSourcesFromCommonMode), (void *)rl);
+ CFRelease(set);
+ }
+ } else {
+ __CFRunLoopUnlock(rl);
+ }
+ } else {
+ rlm = __CFRunLoopFindMode(rl, modeName, false);
+ __CFRunLoopUnlock(rl);
+ if (NULL != rlm && NULL != rlm->_sources) {
+ CFSetRef set = CFSetCreateCopy(kCFAllocatorSystemDefault, rlm->_sources);
+ __CFRunLoopModeUnlock(rlm);
+ CFTypeRef context[2] = {rl, modeName};
+ CFSetApplyFunction(set, (__CFRunLoopRemoveSourceFromMode), (void *)context);
+ CFRelease(set);
+ } else if (NULL != rlm) {
+ __CFRunLoopModeUnlock(rlm);
+ }
+ }
+}
+