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���,}tjƒ��} |jƒt_| j|tjƒ| j|tjƒxèy®xdd„| jƒDƒ} | râPqâW|| k�r t‚|jƒd �l} d } tjƒd k�r€zFyt| |||ƒWn.tk �rntjtj ƒŽtj!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..rr)'rZcurrent_processZ _inheritingrZimport_main_pathÚ __import__Ú ImportErrorrZ _close_stdinrDÚSIGCHLDÚSIG_IGNÚSIGINTr8r'r(Ú selectorsZDefaultSelectorZ getsocknameÚ _forkserverrÚregisterZ EVENT_READZselectÚ SystemExitZacceptr)Ú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’sR          rcc Cs¦|jƒtj|ƒx |jƒD]\}}tj||ƒqWtj|tdƒ}|jƒ|^}}t_} t_ | t j _ t |tjƒƒdtjkrŽddl} | jƒtj|ƒ} t || ƒdS)NrÚrandomr)r+r)r8rDrZrecvfdsr%rPrrrZ_semaphore_trackerZ_fdÚwrite_unsignedÚgetpidrVÚmodulesrdZseedrÚ_main) r`r>r?r_rErFr,r.r-ZstfdrdrarrrrTÏs   rTcCsRd}tj}x8t|ƒ|krBtj||t|ƒƒ}|s8tdƒ‚||7}q Wtj|ƒdS)Nózunexpected EOFr)ÚUNSIGNED_STRUCTÚsizer$r)ÚreadÚEOFErrorZunpack)Úfdr=Zlengthr`rrrÚ read_unsignedðs rocCs@tj|ƒ}x0|r:tj||ƒ}|dkr,tdƒ‚||d…}q WdS)Nrzshould not get here)rjZpackr)ÚwriteÚ RuntimeError)rnÚnÚmsgÚnbytesrrrreús   re)NN)r]r)rOrDr'ZstructrVrÚrrÚcontextrrrrÚ__all__r%ZStructrjÚobjectrrcrTrorerPr r r r rrrrÚs6       s =!