#define CHECK_FOR_FORK() do { __CF120290 = true; if (__CF120293) __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__(); } while (0)
void __CFInitialize(void) {
     if (!__CFInitialized && !__CFInitializing) {
        __CFInitializing = 1;
        // to do...

        // pthread_atfork(void (prepare)(void),void (parent)(void), void(*child)(void))
        pthread_atfork(__01121__, NULL, __01123__);
     }
}

在RunTime的初始化方法中,通过pthread_atfork() 设置fork进程要执行的方法。

prepare(__01121__)在fork进程创建子进程(__01123__)前调用,并能获取到所有锁;

child 创建后对所有锁进行解锁;

//多进程判断
static void __01121__(void) {
    __CF120291 = pthread_is_threaded_np() ? true : false;
}

static void __01123__(void) {
    // Ideally, child-side atfork handlers should be async-cancel-safe, as fork()
    // is async-cancel-safe and can be called from signal handlers.  See also
    // http://standards.ieee.org/reading/ieee/interp/1003-1c-95_int/pasc-1003.1c-37.html
    // This is not a problem for CF.
    if (__CF120290) {
	__CF120293 = true;
#if DEPLOYMENT_TARGET_MACOSX
	if (__CF120291) {
	    CRSetCrashLogMessage2("*** multi-threaded process forked ***");
	} else {
	    CRSetCrashLogMessage2("*** single-threaded process forked ***");
	}
#endif
    }
}

__CF120290 控制fork进程能否赋值

__CF120293 fork进程标识

#define EXEC_WARNING_STRING_1 "The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().\n"
#define EXEC_WARNING_STRING_2 "Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.\n"

CF_PRIVATE void __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__(void) {
    write(2, EXEC_WARNING_STRING_1, sizeof(EXEC_WARNING_STRING_1) - 1);
    write(2, EXEC_WARNING_STRING_2, sizeof(EXEC_WARNING_STRING_2) - 1);
//    HALT;
}

当__CF120293 == true ,表明当前进程是fork的child。再使用CoreFoundation可能存在安全问题(子进程使用父进程数据),应该用exec()置换进程。

CF_EXPORT CFRunLoopRef _CFRunLoopGet0(pthread_t t) {
    // kNilPthreadT 是静态常量 ‘static _CFThreadRef const kNilPthreadT = (_CFThreadRef)0;‘
    // t 主线程
    if (pthread_equal(t, kNilPthreadT)) {
	t = pthread_main_thread_np();
    }
    __CFLock(&loopsLock);
    if (!__CFRunLoops) {
        __CFUnlock(&loopsLock);
	CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorSystemDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);
        //主线程循环
	CFRunLoopRef mainLoop = __CFRunLoopCreate(pthread_main_thread_np());
        // 用利用key-value,将祝线程和runloop进行绑定
	CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);
	if (!OSAtomicCompareAndSwapPtrBarrier(NULL, dict, (void * volatile *)&__CFRunLoops)) {
	    CFRelease(dict);
	}
	CFRelease(mainLoop);
        __CFLock(&loopsLock);
    }
    
    //查询其他线程中有无对应runloop
    CFRunLoopRef loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
    __CFUnlock(&loopsLock);
    
    //没有获取到,要重新创建
    if (!loop) {
	CFRunLoopRef newLoop = __CFRunLoopCreate(t);
        __CFLock(&loopsLock);
        //二次验证,获取runloop
	loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
	if (!loop) {
	    CFDictionarySetValue(__CFRunLoops, pthreadPointer(t), newLoop);
	    loop = newLoop;
	}
        // don't release run loops inside the loopsLock, because CFRunLoopDeallocate may end up taking it
        __CFUnlock(&loopsLock);
	CFRelease(newLoop);
    }
    if (pthread_equal(t, pthread_self())) {
        _CFSetTSD(__CFTSDKeyRunLoop, (void *)loop, NULL);
        if (0 == _CFGetTSD(__CFTSDKeyRunLoopCntr)) {
            _CFSetTSD(__CFTSDKeyRunLoopCntr, (void *)(PTHREAD_DESTRUCTOR_ITERATIONS-1), (void (*)(void *))__CFFinalizeRunLoop);
        }
    }
    return loop;
}

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。