o […dn/ã@súddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl mZddl mZddl mZgd ¢Zd Ze d ¡ZGd d „d eƒZddd„Zdd„Zdd„Zdd„ZeƒZejZejZejZejZdS)éNé)Ú connection)Úprocess)Ú reduction)Úresource_tracker)Úspawn)Úutil)Úensure_runningÚget_inherited_fdsÚconnect_to_new_processÚset_forkserver_preloadéÚqc@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)Ú ForkServercCs.d|_d|_d|_d|_t ¡|_dg|_dS)NÚ__main__)Ú_forkserver_addressÚ_forkserver_alive_fdÚ_forkserver_pidÚ_inherited_fdsÚ threadingÚLockÚ_lockÚ_preload_modules©Úself©rú1/usr/lib/python3.10/multiprocessing/forkserver.pyÚ__init__"s   zForkServer.__init__cCs4|j | ¡WdƒdS1swYdS©N)rÚ_stop_unlockedrrrrÚ_stop*s "ÿzForkServer._stopcCsV|jdurdSt |j¡d|_t |jd¡d|_t |j¡s&t |j¡d|_dS)Nr) rÚosÚcloserÚwaitpidrÚis_abstract_socket_namespacerÚunlinkrrrrr/s     zForkServer._stop_unlockedcCs&tdd„|jDƒƒstdƒ‚||_dS)z>Set list of module names to try to load in forkserver process.css|] }t|ƒtuVqdSr)ÚtypeÚstr)Ú.0ÚmodrrrÚ @s€z4ForkServer.set_forkserver_preload..z&module_names must be a list of stringsN)ÚallrÚ TypeError)rÚ modules_namesrrrr >s z!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. )rrrrrr DszForkServer.get_inherited_fdsc Csð| ¡t|ƒdtkrtdƒ‚t tj¡X}| |j¡t  ¡\}}t  ¡\}}|||j t   ¡g}||7}z,zt  ||¡||fWWt |¡t |¡WdƒSt |¡t |¡‚t |¡t |¡w1sqwYdS)a;Request forkserver to create a child process. Returns a pair of fds (status_r, data_w). The calling process can read the child process's pid and (eventually) its returncode from status_r. The calling process should write to data_w the pickled preparation and process data. éz too many fdsN)r ÚlenÚMAXFDS_TO_SENDÚ ValueErrorÚsocketÚAF_UNIXÚconnectrr!ÚpiperrÚgetfdrÚsendfdsr")rÚfdsÚclientÚparent_rÚchild_wÚchild_rÚparent_wÚallfdsrrrr Ls0   ÿ    ð    ðz!ForkServer.connect_to_new_processc sÐ|jÛt ¡|jdur1t |jtj¡\}}|s" WdƒdSt |j¡d|_ d|_d|_d}|j rKddh‰t   d¡}‡fdd„|  ¡Dƒ}ni}t tj¡s}t d¡}| |¡t |¡sit |d ¡| ¡t ¡\}}z„sz-ForkServer.ensure_running..r3i€z-c)rrr rr!r#ÚWNOHANGr"rrrrÚget_preparation_dataÚitemsr2r3rÚarbitrary_addressÚbindrr$ÚchmodÚlistenr5ÚfilenoÚget_executableÚ_args_from_interpreter_flagsÚspawnv_passfds) rÚpidÚstatusÚcmdÚdataÚlistenerÚaddressÚalive_rÚalive_wÚ fds_to_passÚexeÚargsrrDrr isZ ù        ÿ  ýçè"èzForkServer.ensure_runningN) Ú__name__Ú __module__Ú __qualname__rr rr r r r rrrrr s rc Csè|r4d|vr |dur dt ¡_z t |¡Wt ¡`nt ¡`w|D]}zt|ƒWq"ty3Yq"wt ¡t   ¡\}}t   |d¡t   |d¡dd„}t j |t jt ji} dd„|  ¡Dƒ} t  |¡i} tjtj|d y} t ¡b} |  ¡t_|  | tj¡|  |tj¡|  |tj¡ z( d d „|  ¡Dƒ}|r¡nq•||vr´t  |d ¡d ks²Jdƒ‚t‚||vr t  |d¡ z t  dt j¡\}}Wn t yÔYn5w|dkrÚn/|  !|d¡}|durt  "|¡}zt#||ƒWn t$yúYnwt  %|¡nt& 'd|¡qÀ| |vrº|  (¡d}t) *|t+d ¡}t,|ƒt+kr-t-d .t,|ƒ¡ƒ‚|^}}}| %¡t  /¡}|dkr„d }z.sigchld_handlercSsi|] \}}|t ||¡“qSr)Úsignal)r(ÚsigÚvalrrrrFÆsÿzmain..)rNcSsg|]\}}|j‘qSr)Úfileobj)r(ÚkeyÚeventsrrrÚ Úszmain..róz Not at EOF?iéÿÿÿÿrz.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)=rÚcurrent_processÚ _inheritingrÚimport_main_pathÚ __import__Ú ImportErrorrÚ _close_stdinr!r5Ú set_blockingrbÚSIGCHLDÚSIGINTÚSIG_IGNrIÚ set_wakeup_fdr2r3Ú selectorsÚDefaultSelectorÚ getsocknameÚ _forkserverrÚregisterÚ EVENT_READÚselectÚreadÚ SystemExitr#rGÚChildProcessErrorÚpopÚwaitstatus_to_exitcodeÚ write_signedÚBrokenPipeErrorr"ÚwarningsÚwarnÚacceptrÚrecvfdsr0r/Ú RuntimeErrorÚformatÚforkÚextendÚvaluesÚ _serve_oneÚ ExceptionÚsysÚ excepthookÚexc_infoÚstderrÚflushÚ_exitÚOSErrorÚerrnoÚ ECONNABORTED)Ú listener_fdrXÚpreloadr?r@ÚmodnameÚsig_rÚsig_wraÚhandlersÚ old_handlersÚ pid_to_fdrVÚselectorÚrfdsrRÚstsr;Ú returncodeÚsr8r<ÚcodeÚ unused_fdsÚfdÚerrrÚmain§sæ    ÿ   üÿ ÿ ý   ÿ    þ ÿë ÿÿ   þþ€þ €Ü€& ÿ€ÿ±8ør©c Csht d¡| ¡D] \}}t ||¡q |D]}t |¡q|^t_tj_ t_ t  |¡}t   ||¡}|S)Nrj)rbrurIr!r"ryrrÚ_resource_trackerÚ_fdrÚduprÚ_main) r<r8r¦rrcrdr§Úparent_sentinelr¥rrrr+s  þ  rcCsXd}tj}t|ƒ|kr%t ||t|ƒ¡}|stdƒ‚||7}t|ƒ|ks t |¡dS)Nrizunexpected EOFr)Ú SIGNED_STRUCTÚsizer/r!r}ÚEOFErrorÚunpack)r§rUÚlengthr¤rrrÚ read_signedBs  ür´cCsBt |¡}|rt ||¡}|dkrtdƒ‚||d…}|sdSdS)Nrzshould not get here)r¯Úpackr!Úwriterˆ)r§ÚnÚmsgÚnbytesrrrr‚Ls    ür‚)NN) r–r!rvrbr2Ústructrrr„ÚrrÚcontextrrrrÚ__all__r0ÚStructr¯Úobjectrr©rr´r‚ryr r r r rrrrÚs<