3 \ö!ã@söddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddlm Z ddl m Z ddlm Z ddlmZddlmZd d d d gZd ZejdƒZGdd„deƒZddd„Zdd„Zdd„Zdd„ZeƒZejZejZejZejZdS)éNé)Ú connection)Úprocess)Ú reduction)Úsemaphore_tracker)Úspawn)ÚutilÚensure_runningÚget_inherited_fdsÚconnect_to_new_processÚset_forkserver_preloadéÚQc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú ForkServercCs.d|_d|_d|_d|_tjƒ|_dg|_dS)NÚ__main__)Ú_forkserver_addressÚ_forkserver_alive_fdÚ_forkserver_pidÚ_inherited_fdsÚ threadingZLockÚ_lockÚ_preload_modules)Úself©rú2/usr/lib64/python3.6/multiprocessing/forkserver.pyÚ__init__!s  zForkServer.__init__cCs&tdd„|jDƒƒstdƒ‚||_dS)z>Set list of module names to try to load in forkserver process.css|]}t|ƒtkVqdS)N)ÚtypeÚstr)Ú.0Úmodrrrú +sz4ForkServer.set_forkserver_preload..z&module_names must be a list of stringsN)ÚallrÚ TypeError)rZ modules_namesrrrr )sz!ForkServer.set_forkserver_preloadcCs|jS)z”Return list of fds inherited from parent process. This returns None if the current process was not started by fork server. )r)rrrrr /szForkServer.get_inherited_fdscCsÎ|jƒt|ƒdtkr tdƒ‚tjtjƒ�˜}|j|jƒtj ƒ\}}tj ƒ\}}|||j t j ƒg}||7}z.r(i€z-czCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r))rrr rr)ÚwaitpidÚWNOHANGr+rrrrZget_preparation_dataÚdictÚitemsr'r(rZarbitrary_addressZbindÚchmodZlistenr*ÚfilenoZget_executablerZ_args_from_interpreter_flagsZspawnv_passfds) rÚpidZstatusÚcmdÚdataÚlistenerZaddressÚalive_rZalive_wZ fds_to_passZexeÚargsr)r4rr TsL             zForkServer.ensure_runningN)Ú__name__Ú __module__Ú __qualname__rr r r r rrrrrs rc4Cs|rhd|kr8|dk r8dtjƒ_ztj|ƒWdtjƒ`Xx.|D]&}y t|ƒWq>tk rbYq>Xq>Wtjƒt j t j t j t j i}dd„|j ƒDƒ}tjtj|d���R}tjƒ��<} |jƒt_| j|tjƒ| j|tjƒ�x yÒxdd„| jƒDƒ} | räPqäW|| k�r$tj|d ƒd k�s t‚t‚|| k�s2t‚|jƒd �l} d } tjƒd k�r¦zFyt| |||ƒWn.tk �r”t j!t j"ƒŽt j#j$ƒYnXWdtj%| ƒXWdQRXWqàt&k �ræ} z| j't'j(k�rÖ‚WYdd} ~ XqàXqàWWdQRXWdQRXdS) zRun forkserver.rNTcSsi|]\}}tj||ƒ|“qSr)Úsignal)rÚsigÚvalrrrú ©szmain..)r:cSsg|]\}}|j‘qSr)Zfileobj)rÚkeyZeventsrrrú ¶szmain..rór))rZcurrent_processZ _inheritingrZimport_main_pathÚ __import__Ú ImportErrorrZ _close_stdinrDÚSIGCHLDÚSIG_IGNÚSIGINTr8r'r(Ú selectorsZDefaultSelectorZ getsocknameÚ _forkserverrÚregisterZ EVENT_READZselectr)ÚreadÚAssertionErrorÚ SystemExitZacceptÚforkÚ _serve_oneÚ ExceptionÚsysÚ excepthookÚexc_infoÚstderrÚflushÚ_exitÚOSErrorÚerrnoZ ECONNABORTED)Z listener_fdr?Zpreloadr/r0ÚmodnameÚhandlersZ old_handlersr>ZselectorZrfdsÚsÚcodeÚerrrÚmain’sV          rfc Cs¶|jƒtj|ƒx |jƒD]\}}tj||ƒqWtj|tdƒ}|jƒt|ƒtks\t‚|^}}t _ } t _ | t j _t|tjƒƒdtjkržddl} | jƒtj|ƒ} t|| ƒdS)NrÚrandomr)r+r)r8rDrZrecvfdsr%r$rTrQrrrZ_semaphore_trackerZ_fdÚwrite_unsignedÚgetpidrYÚmodulesrgZseedrÚ_main) rcr>r?rbrErFr,r.r-ZstfdrgrdrrrrWÏs   rWcCsRd}tj}x8t|ƒ|krBtj||t|ƒƒ}|s8tdƒ‚||7}q Wtj|ƒdS)NrJzunexpected EOFr)ÚUNSIGNED_STRUCTÚsizer$r)rSÚEOFErrorZunpack)Úfdr=ZlengthrcrrrÚ read_unsignedðs rpcCs@tj|ƒ}x0|r:tj||ƒ}|dkr,tdƒ‚||d…}q WdS)Nrzshould not get here)rlZpackr)ÚwriteÚ RuntimeError)roÚnÚmsgÚnbytesrrrrhús   rh)NN)r`r)rPrDr'ZstructrYrÚrrÚcontextrrrrÚ__all__r%ZStructrlÚobjectrrfrWrprhrQr r r r rrrrÚs6       s =!