a  zen/@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl mZddl mZddl mZgd Zd Zed ZGd d d eZdddZddZddZddZeZejZejZejZejZdS)N) connection)process) reduction)resource_tracker)spawn)util)ensure_runningget_inherited_fdsconnect_to_new_processset_forkserver_preloadqc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS) ForkServercCs.d|_d|_d|_d|_t|_dg|_dS)N__main__)_forkserver_address_forkserver_alive_fd_forkserver_pid_inherited_fds threadingLock_lock_preload_modulesselfrN/opt/bitninja-python-dojo/embedded/lib/python3.9/multiprocessing/forkserver.py__init__"s  zForkServer.__init__cCs2|j|Wdn1s$0YdSN)r_stop_unlockedrrrr_stop*szForkServer._stopcCsV|jdurdSt|jd|_t|jdd|_t|jsLt|jd|_dS)Nr) roscloserwaitpidris_abstract_socket_namespacerunlinkrrrrr/s    zForkServer._stop_unlockedcCs&tdd|jDstd||_dS)z>Set list of module names to try to load in forkserver process.css|]}t|tuVqdSr)typestr).0modrrr @z4ForkServer.set_forkserver_preload..z&module_names must be a list of stringsN)allr TypeError)rZ modules_namesrrrr >sz!ForkServer.set_forkserver_preloadcCs|jS)zReturn 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 tdttj}||jt \}}t \}}|||j t g}||7}zvz:t ||||fWWt|t|WdSt|t|Yn0Wt|t|nt|t|0Wdn1s0YdS)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 lenMAXFDS_TO_SEND ValueErrorsocketAF_UNIXconnectrr!piperrZgetfdrsendfdsr")rfdsclientparent_rchild_wchild_rparent_wZallfdsrrrr Ls2            z!ForkServer.connect_to_new_processc s|jt|jdurbt|jtj\}}|sDWddSt|jd|_ d|_d|_d}|j rddht d}fdd| D}ni}ttj}td}||t|st|d |t\}}z~zV||g} ||||j |f;}t } | gt} | d |g7} t| | | }Wnt|Yn0Wt|n t|0||_ ||_||_Wdn1s0YWdn1s0YdS) zMake 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_pathsys_pathignorecsi|]\}}|vr||qSrr)r(xyZ desired_keysrr r+z-ForkServer.ensure_running..r3iz-c)rrr rr!r#WNOHANGr"rrrrZget_preparation_dataitemsr2r3rarbitrary_addressbindrr$chmodlistenr5filenoZget_executable_args_from_interpreter_flagsspawnv_passfds) rpidstatuscmddatalisteneraddressalive_rZalive_wZ fds_to_passZexeargsrrBrr 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|WqDtyfYqD0qDtt \}}t |dt |ddd}t j |t jt ji} dd| D} t |i} tjtj|d } t} | t_| | tj| |tj| |tjzjd d | D}|r(qHq(||vrpt |d d kslJdt||vr(t |dzt dt j\}}Wnt yYq(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| 1t2|||| }Wn,t3yt4j5t46t4j78Yn0Wt 9|n t 9|0nLzt#||Wnt$yDYn0|| |<t %||D]}t %|q\Wdn1s0YWn6t:y}z|j;t;j.sigchld_handlercSsi|]\}}|t||qSr)signal)r(sigvalrrrrCszmain..)rJcSsg|]\}}|jqSr)fileobj)r(keyeventsrrr r+zmain..rr+z Not at EOF?irz.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)=rcurrent_processZ _inheritingrZimport_main_path __import__ ImportErrorr _close_stdinr!r5 set_blockingrYSIGCHLDSIGINTSIG_IGNrE set_wakeup_fdr2r3 selectorsDefaultSelector getsockname _forkserverrregister EVENT_READselectread SystemExitr#rDChildProcessErrorpopwaitstatus_to_exitcode write_signedBrokenPipeErrorr"warningswarnacceptrrecvfdsr0r/ RuntimeErrorformatforkextendvalues _serve_one Exceptionsys excepthookexc_infostderrflush_exitOSErrorerrnoZ ECONNABORTED)Z listener_fdrSZpreloadr=r>modnameZsig_rZsig_wrXhandlersZ old_handlersZ pid_to_fdrQselectorZrfdsrMstsr: returncodesr7r;code unused_fdsfderrrmains                        2rc Cshtd|D]\}}t||q|D]}t|q,|^t_tj_ t_ t |}t ||}|S)Nr`)rYrirEr!r"rmrr_resource_trackerZ_fdrduprZ_main) r;r7rrrZr[rparent_sentinelrrrrr+s    rcCsNd}tj}t||kr@t||t|}|s6td||7}q t|dS)Nr+zunexpected EOFr) SIGNED_STRUCTsizer/r!rqEOFErrorunpack)rrPlengthrrrr read_signedBs  rcCs<t|}|r8t||}|dkr*td||d}q dS)Nrzshould not get here)rpackr!writer|)rnmsgnbytesrrrrvLs   rv)NN) rr!rjrYr2structrrrxrrcontextrrrr__all__r0Structrobjectrrrrrvrmr r r r rrrrs: