B âÁ÷S•D‹ã@sþddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl mZddl mZddl mZd d d d gZd Ze d¡ZGdd„deƒZddd„Zdd„Zdd„Zdd„ZeƒZejZejZejZejZdS)éNé)Ú connection)Úprocess)Ú reduction)Úsemaphore_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Ú threadingZLockÚ_lockÚ_preload_modules)Úself©rú?/opt/alt/python37/lib64/python3.7/multiprocessing/forkserver.pyÚ__init__"s  zForkServer.__init__c Cs|j| ¡WdQRXdS)N)rÚ_stop_unlocked)rrrrÚ_stop*szForkServer._stopcCsJ|jdkrdSt |j¡d|_t |jd¡d|_t |j¡d|_dS)Nr)rÚosÚcloserÚwaitpidÚunlinkr)rrrrr/s   zForkServer._stop_unlockedcCs&tdd„|jDƒƒstdƒ‚||_dS)z>Set list of module names to try to load in forkserver process.css|]}t|ƒtkVqdS)N)ÚtypeÚstr)Ú.0Úmodrrrú ?sz4ForkServer.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. )r)rrrrr CszForkServer.get_inherited_fdsc CsÎ| ¡t|ƒdtkr tdƒ‚t tj¡˜}| |j¡t  ¡\}}t  ¡\}}|||j t   ¡g}||7}zƒsz-ForkServer.ensure_running..r.i€z-c)rrr rrr ÚWNOHANGrrrrrZget_preparation_dataÚitemsr-r.rZarbitrary_addressZbindrZis_abstract_socket_namespaceÚchmodZlistenr/ÚfilenoZget_executableZ_args_from_interpreter_flagsZspawnv_passfds) rÚpidZstatusÚcmdÚdataÚlistenerZaddressÚalive_rZalive_wZ fds_to_passZexeÚargsr)r8rr hsL              zForkServer.ensure_runningN) Ú__name__Ú __module__Ú __qualname__rrrr r r r rrrrr src Cs|rhd|kr8|dk r8dt ¡_zt |¡Wdt ¡`Xx.|D]&}y t|ƒWq>tk rbYq>Xq>Wt ¡t   ¡\}}t   |d¡t   |d¡dd„}t j |t jt ji} dd„|  ¡Dƒ} t  |¡i} tjtj|d } t ¡} |  ¡t_|  | tj¡|  |tj¡|  |tj¡xÊyŒx d d „|  ¡Dƒ}|r,Pq,W||krtt  |d ¡d ksptdƒ‚t‚||krdt  |d¡xØyt  dt j ¡\}}Wnt!k rºPYnX|dkrÈP|  "|d¡}|dk rPt  #|¡røt  $|¡ }n&t  %|¡std &||¡ƒ‚t  '|¡}yt(||ƒWnt)k rBYnXt  *|¡nt+ ,d|¡qŒW| |kr²|  -¡d0}t. /|t0d ¡}t1|ƒt0kr®t2d &t1|ƒ¡ƒ‚|^}}}| *¡t  3¡}|dkrVd }zpy<|  *¡|  *¡||||g}| 4|  5¡¡t6|||| ƒ}Wn.t7k rBt8j9t8 :¡Žt8j; <¡YnXWdt  =|¡XnRyt(||ƒWnt)k rzYnX|| |<t  *|¡x|D]}t  *|¡q”WWdQRXWn4t>k rè}z|j?t?j@krØ‚Wdd}~XYnXq&WWdQRXWdQRXdS)zRun forkserver.rNTFcWsdS)Nr)Z_unusedrrrÚsigchld_handler»szmain..sigchld_handlercSsi|]\}}t ||¡|“qSr)Úsignal)r$ÚsigÚvalrrrr9Åszmain..)r=cSsg|]\}}|j‘qSr)Zfileobj)r$ÚkeyZeventsrrrú Ùszmain..róz Not at EOF?iéÿÿÿÿrzChild {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_stdinrr/Ú set_blockingrHÚSIGCHLDÚSIGINTÚSIG_IGNr;Ú set_wakeup_fdr-r.Ú selectorsZDefaultSelectorZ getsocknameÚ _forkserverrÚregisterZ EVENT_READZselectÚreadÚAssertionErrorÚ SystemExitr r:ÚChildProcessErrorÚpopÚ WIFSIGNALEDÚWTERMSIGÚ WIFEXITEDÚformatÚ WEXITSTATUSÚ write_signedÚBrokenPipeErrorrÚwarningsÚwarnZacceptrZrecvfdsr+r*Ú RuntimeErrorÚforkÚextendÚvaluesÚ _serve_oneÚ ExceptionÚsysÚ excepthookÚexc_infoÚstderrÚflushÚ_exitÚOSErrorÚerrnoZ ECONNABORTED)Z listener_fdrBZpreloadr3r4ÚmodnameZsig_rZsig_wrGÚhandlersZ old_handlersZ pid_to_fdrAZselectorZrfdsr>Ústsr1Ú returncodeÚsr0r2ÚcodeÚ unused_fdsÚfdÚerrrÚmain¦s                                r~cCsdt d¡x | ¡D]\}}t ||¡qWx|D]}t |¡q2W|^t_tj_ t_ t   |¡}|S)NrN) rHrUr;rrrWrrZ_semaphore_trackerZ_fdrrÚ_main)r2r0r{rvrIrJr|rzrrrrk0s   rkcCsRd}tj}x8t|ƒ|krBt ||t|ƒ¡}|s8tdƒ‚||7}q Wt |¡dS)NrMzunexpected EOFr)Ú SIGNED_STRUCTÚsizer*rrYÚEOFErrorZunpack)r|r@ÚlengthryrrrÚ read_signedFs r„cCs@t |¡}x0|r:t ||¡}|dkr,tdƒ‚||d…}q WdS)Nrzshould not get here)r€ZpackrÚwriterg)r|ÚnÚmsgÚnbytesrrrrcPs   rc)NN) rtrrVrHr-ZstructrmrreÚrrÚcontextrrrrÚ__all__r+ZStructr€Úobjectrr~rkr„rcrWr r r r rrrrÚs<