U ,a0@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl mZddl mZddl mZd d d d gZd ZedZGdddeZdddZddZddZddZeZejZejZejZejZdS)N) connection)process) reduction)resource_tracker)spawn)utilensure_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 threadingZLock_lock_preload_modulesselfr?/opt/alt/python38/lib64/python3.8/multiprocessing/forkserver.py__init__"s  zForkServer.__init__c Cs|j|W5QRXdSN)r_stop_unlockedrrrr_stop*szForkServer._stopcCsV|jdkrdSt|jd|_t|jdd|_t|jsLt|jd|_dS)Nr) roscloserwaitpidris_abstract_socket_namespacerunlinkrrrrr/s    zForkServer._stop_unlockedcCs&tdd|jDstd||_dS)Ncss|]}t|tkVqdSr)typestr).0modrrr @sz4ForkServer.set_forkserver_preload..z&module_names must be a list of strings)allr TypeError)rZ modules_namesrrrr >sz!ForkServer.set_forkserver_preloadcCs|jSr)rrrrrr DszForkServer.get_inherited_fdsc Cs|t|dtkr tdttj}||jt \}}t \}}|||j t g}||7}zNz&t||||fWW4W5QRSt |t |YnXW5t |t |XW5QRXdS)Nz too many fds)r lenMAXFDS_TO_SEND ValueErrorsocketAF_UNIXZconnectrr piperrZgetfdr!rZsendfds)rfdsZclientZparent_rchild_wchild_rZparent_wZallfdsrrrr Ls(        z!ForkServer.connect_to_new_processc s|j~t|jdk r`t|jtj\}}|sBW5QRdSt|jd|_ d|_d|_d}|j rddht d}fdd| D}ni}ttj}td}||t|st|d|t\}}ztzV||g} ||||j |f;}t } | gt} | d |g7} t| | | }Wnt|YnXW5t|X||_ ||_||_W5QRXW5QRXdS) NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r) main_pathsys_pathignorecsi|]\}}|kr||qSrr)r'xyZ desired_keysrr sz-ForkServer.ensure_running..r1iz-c)rrr rr r"WNOHANGr!rrrrZget_preparation_dataitemsr0r1rZarbitrary_addressZbindrr#chmodZlistenr2filenoZget_executableZ_args_from_interpreter_flagsZspawnv_passfds) rpidZstatuscmddatalistenerZaddressalive_rZalive_wZ fds_to_passZexeargsrr;rr isN              zForkServer.ensure_runningN) __name__ __module__ __qualname__rrrr r r r rrrrr src Cs|rdd|kr8|dk r8dt_zt|W5t`X|D]&}z t|Wq<tk r`Yqk r}z|j?t?j@krW5d}~XYnXqW5QRXW5QRXdS)NrTFcWsdSrr)Z_unusedrrrsigchld_handlerszmain..sigchld_handlercSsi|]\}}|t||qSr)signal)r'sigvalrrrr<szmain..)r@cSsg|]\}}|jqSr)Zfileobj)r'keyZeventsrrr szmain..irzChild {0:n} status is {1:n}z.forkserver: waitpid returned unexpected pid %drzToo many ({0:n}) fds to send)ArZcurrent_processZ _inheritingrZimport_main_path __import__ ImportErrorrZ _close_stdinr r2 set_blockingrKSIGCHLDSIGINTSIG_IGNr> set_wakeup_fdr0r1 selectorsZDefaultSelectorZ getsockname _forkserverrregisterZ EVENT_READZselect SystemExitreadr"r=ChildProcessErrorpop WIFSIGNALEDWTERMSIG WIFEXITEDAssertionErrorformat WEXITSTATUS write_signedBrokenPipeErrorr!warningswarnZacceptrZrecvfdsr.r- RuntimeErrorfork_exitextendvalues _serve_one Exceptionsys excepthookexc_infostderrflushOSErrorerrnoZ ECONNABORTED)Z listener_fdrEZpreloadr6r7modnameZsig_rZsig_wrJhandlersZ old_handlersZ pid_to_fdrDZselectorZrfdsrAstsr4 returncodesr3r5code unused_fdsfderrrmains                         rc Cshtd|D]\}}t||q|D]}t|q,|^t_tj_ t_ t |}t ||}|S)NrP)rKrWr>r r!rYrrZ_resource_trackerZ_fdrduprZ_main) r5r3r}rxrLrMr~Zparent_sentinelr|rrrrn1s    rncCsNd}tj}t||kr@t||t|}|s6td||7}q t|dS)Nzunexpected EOFr) SIGNED_STRUCTsizer-r r\EOFErrorZunpack)r~rCZlengthr{rrr read_signedHs  rcCs<t|}|r8t||}|dkr*td||d}q dS)Nrzshould not get here)rZpackr writeri)r~nmsgnbytesrrrreRs   re)NN) rvr rXrKr0Zstructrprrgrrcontextrrrr__all__r.ZStructrobjectrrrnrrerYr r r r rrrrs>