a ÕDOgn/ã@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ú2/usr/lib64/python3.9/multiprocessing/forkserver.pyÚ__init__"s  zForkServer.__init__cCs2|j| ¡Wdƒn1s$0YdS©N)rÚ_stop_unlockedrrrrÚ_stop*szForkServer._stopcCsV|jdurdSt |j¡d|_t |jd¡d|_t |j¡sLt |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Ú @óz4ForkServer.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. )rrrrrr DszForkServer.get_inherited_fdsc Cs| ¡t|ƒdtkr tdƒ‚t tj¡Ü}| |j¡t  ¡\}}t  ¡\}}|||j t   ¡g}||7}zvz:t  ||¡||fWWt |¡t |¡WdƒSt |¡t |¡‚Yn0Wt |¡t |¡nt |¡t |¡0Wdƒn1s0YdS)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!ÚpiperrZgetfdrÚsendfdsr")rÚfdsÚclientÚparent_rÚchild_wÚchild_rÚparent_wZallfdsrrrr Ls2   ÿ    ù     ÿ z!ForkServer.connect_to_new_processc sÈ|jªt ¡|jdurbt |jtj¡\}}|sDWdƒdSt |j¡d|_ d|_d|_d}|j r–ddh‰t   d¡}‡fdd„|  ¡Dƒ}ni}t tj¡ì}t d¡}| |¡t |¡sÒt |d ¡| ¡t ¡\}}z~zV| ¡|g} || ¡||j |f;}t  ¡} | gt ¡} | d |g7} t | | | ¡}Wnt |¡‚Yn0Wt |¡n t |¡0||_ ||_||_Wdƒn1sš0YWdƒn1sº0YdS) zíMake sure that a fork server is running. This can be called from any process. Note that usually a child process will just reuse the forkserver started by its parent, so ensure_running() will do nothing. NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)Ú main_pathÚsys_pathÚignorecsi|]\}}|ˆvr||“qSrr)r(ÚxÚy©Z desired_keysrrÚ „r+z-ForkServer.ensure_running..r3i€z-c)rrr rr!r#ÚWNOHANGr"rrrrZget_preparation_dataÚitemsr2r3rÚarbitrary_addressÚbindrr$ÚchmodÚlistenr5ÚfilenoZget_executableÚ_args_from_interpreter_flagsÚspawnv_passfds) rÚpidÚstatusÚcmdÚdataÚlistenerÚaddressÚalive_rZalive_wZ fds_to_passZexeÚargsrrBrr isN          ÿ   zForkServer.ensure_runningN) Ú__name__Ú __module__Ú __qualname__rr rr r r r rrrrr src Cs|rjd|vr@|dur@dt ¡_zt |¡Wt ¡`n t ¡`0|D]$}z t|ƒWqDtyfYqD0qDt ¡t   ¡\}}t   |d¡t   |d¡dd„}t j |t jt ji} dd„|  ¡Dƒ} t  |¡i} tjtj|d } t ¡ì} |  ¡t_|  | tj¡|  |tj¡|  |tj¡zjd d „|  ¡Dƒ}|r(qHq(||vrpt  |d ¡d kslJdƒ‚t‚||vr(t  |d¡zt  dt j¡\}}Wnt y¶Yq(Yn0|dkrÆq(|  !|d¡}|durt  "|¡}zt#||ƒWnt$yYn0t  %|¡nt& 'd|¡q†| |vrŽ|  (¡d<}t) *|t+d ¡}t,|ƒt+krrt-d .t,|ƒ¡ƒ‚|^}}}| %¡t  /¡}|dkr"d }zxz<|  %¡|  %¡||||g}| 0|  1¡¡t2|||| ƒ}Wn,t3yt4j5t4 6¡Žt4j7 8¡Yn0Wt  9|¡n t  9|¡0nLzt#||ƒWnt$yDYn0|| |<t  %|¡|D]}t  %|¡q\Wdƒn1s„0YWn6t:yÆ}z|j;t;j.sigchld_handlercSsi|]\}}|t ||¡“qSr)Úsignal)r(ÚsigÚvalrrrrCÆsÿzmain..)rJcSsg|]\}}|j‘qSr)Úfileobj)r(ÚkeyÚeventsrrrÚ Úr+zmain..rr+z Not at EOF?iéÿÿÿÿrz.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)=rÚcurrent_processZ _inheritingrZimport_main_pathÚ __import__Ú ImportErrorrÚ _close_stdinr!r5Ú set_blockingrYÚSIGCHLDÚSIGINTÚSIG_IGNrEÚ set_wakeup_fdr2r3Ú selectorsÚDefaultSelectorÚ getsocknameÚ _forkserverrÚregisterÚ EVENT_READÚselectÚreadÚ SystemExitr#rDÚ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ÚerrnoZ ECONNABORTED)Z listener_fdrSZpreloadr=r>ÚmodnameZsig_rZsig_wrXÚhandlersZ old_handlersZ pid_to_fdrQÚselectorZrfdsrMÚstsr:Ú returncodeÚsr7r;ÚcodeÚ unused_fdsÚfdÚerrrÚmain§sÀ       üÿ ÿ          ÿ  ÿÿ   þ 2r•c Csht d¡| ¡D]\}}t ||¡q|D]}t |¡q,|^t_tj_ t_ t  |¡}t   ||¡}|S)Nr`)rYrirEr!r"rmrrÚ_resource_trackerZ_fdrÚduprZ_main) r;r7r’rŒrZr[r“Úparent_sentinelr‘rrrr+s  þ  rcCsNd}tj}t|ƒ|kr@t ||t|ƒ¡}|s6tdƒ‚||7}q t |¡dS)Nr+zunexpected EOFr)Ú SIGNED_STRUCTÚsizer/r!rqÚEOFErrorÚunpack)r“rPÚlengthrrrrÚ read_signedBs  ržcCs<t |¡}|r8t ||¡}|dkr*tdƒ‚||d…}q dS)Nrzshould not get here)r™Úpackr!Úwriter|)r“ÚnÚmsgÚnbytesrrrrvLs   rv)NN) rŠr!rjrYr2ÚstructrƒrrxÚrrÚcontextrrrrÚ__all__r0ÚStructr™Úobjectrr•rržrvrmr r r r rrrrÚs: