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)z>Set list of module names to try to load in forkserver process.css|]}t|tkVqdSr)typestr).0modrrr @sz4ForkServer.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}zNz&t||||fWW4W5QRSt |t |YnXW5t |t |XW5QRXdS)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_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) 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|]\}}|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@kr̂W5d}~XYnXqW5QRXW5QRXdS)zRun forkserver.rNTFcWsdSrr)Z_unusedrrrsigchld_handlerszmain..sigchld_handlercSsi|]\}}|t||qSr)signal)r'sigvalrrrr<szmain..)r@cSsg|]\}}|jqSr)Zfileobj)r'keyZeventsrrr szmain..rz Not at EOF?irzChild {0:n} status is {1:n}z.forkserver: waitpid returned unexpected pid %dzToo 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_READZselectreadAssertionError SystemExitr"r=ChildProcessErrorpop WIFSIGNALEDWTERMSIG WIFEXITEDformat 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)NrQ)rKrXr>r r!rZrrZ_resource_trackerZ_fdrduprZ_main) r5r3r~ryrLrMrZparent_sentinelr}rrrro1s    rocCsNd}tj}t||kr@t||t|}|s6td||7}q t|dS)NrPzunexpected EOFr) SIGNED_STRUCTsizer-r r\EOFErrorZunpack)rrCZlengthr|rrr read_signedHs  rcCs<t|}|r8t||}|dkr*td||d}q dS)Nrzshould not get here)rZpackr writerj)rnmsgnbytesrrrrfRs   rf)NN) rwr rYrKr0Zstructrqrrhrrcontextrrrr__all__r.ZStructrobjectrrrorrfrZr r r r rrrrs>