nuwa :线程分析,nuwa 如何产生,nuwa如何恢复线程?
Nuwa.cpp 的ForkIPCProcess()
/** * Fork a new process that is ready for running IPC. * * @return the PID of the new process. */ static int ForkIPCProcess() {
P_LOGI(SEPARATOR_LINE); P_LOGI("call -- * Fork a new process that is ready for running IPC. --->"); int pid;
P_LOGI("call -- REAL(pthread_mutex_lock)(&sForkLock); --->"); REAL(pthread_mutex_lock)(&sForkLock);
P_LOGI("call -- PrepareProtoSockets(sProtoFdInfos, sProtoFdInfosSize); --->"); PrepareProtoSockets(sProtoFdInfos, sProtoFdInfosSize);
sNuwaForking = true; pid = fork(); P_LOGI("call -- pid = fork(); pid=%d --->",pid); sNuwaForking = false; if (pid == -1) {
abort(); }
if (pid > 0) {
P_LOGI("call -- // in the parent --->"); // in the parent P_LOGI("call -- AddNewProcess(pid, sProtoFdInfos, sProtoFdInfosSize); --->"); AddNewProcess(pid, sProtoFdInfos, sProtoFdInfosSize);//调用此fork函数的父进程开始发消息给b2g?? P_LOGI("call -- CloseAllProtoSockets(sProtoFdInfos, sProtoFdInfosSize); --->"); CloseAllProtoSockets(sProtoFdInfos, sProtoFdInfosSize); } else {
P_LOGI("call -- // in the child --->"); // in the child sIsNuwaChildProcess = true; if (getenv("MOZ_DEBUG_CHILD_PROCESS")) {
printf("\n\nNUWA CHILDCHILDCHILDCHILD\n debug me @ %d\n\n", getpid()); P_LOGI("call -- sleep(30); --->"); sleep(30); } P_LOGI("call -- AfterForkHook(); --->"); AfterForkHook(); P_LOGI("call -- ReplaceSignalFds(); --->"); ReplaceSignalFds();//开始重建进程中的各线程? ReplaceIPC(sProtoFdInfos, sProtoFdInfosSize); RecreateEpollFds(); RecreateThreads(); CloseAllProtoSockets(sProtoFdInfos, sProtoFdInfosSize); }
//解锁
P_LOGI("call -- sForkWaitCondChanged = true; --->"); sForkWaitCondChanged = true; P_LOGI("call -- pthread_cond_signal(&sForkWaitCond); --->"); pthread_cond_signal(&sForkWaitCond); P_LOGI("call -- pthread_mutex_unlock(&sForkLock); --->"); pthread_mutex_unlock(&sForkLock);
P_LOGI("call -- return pid:%d; --->",p