e f!@sdddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddlm Z ddlm Z ddlm Z ddlm Z ddlmZd d d d gZd ZejdZGdddeZddddZddZddZddZeZejZejZejZejZdS)N) connection)process) reduction)semaphore_tracker)spawn)utilensure_runningget_inherited_fdsconnect_to_new_processset_forkserver_preloadQc@sLeZdZddZddZddZddZd d Zd S) ForkServercCs:d|_d|_d|_tj|_dg|_dS)N__main__)_forkserver_address_forkserver_alive_fd_inherited_fds threadingZLock_lock_preload_modules)selfr?/opt/alt/python34/lib64/python3.4/multiprocessing/forkserver.py__init__!s    zForkServer.__init__cCs8tdd|jDs+tdn||_dS)z>Set list of module names to try to load in forkserver process.css!|]}t|tkVqdS)N)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. )r)rrrrr .szForkServer.get_inherited_fdscCs|jt|dtkr/tdntjtj}|j|jtj \}}tj \}}|||j t j g}||7}zJyt j||||fSWn%tj|tj|YnXWdtj|tj|XWdQXdS)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_UNIXZconnectrospiperrZgetfdrZsendfdsclose)rfdsZclientZparent_rchild_wchild_rZparent_wZallfdsrrrr 6s&       z!ForkServer.connect_to_new_processc s|jtj|jdk r'dSdd}|jr}ddhtjd}tfdd|jD}ni}t j t j  }t j d }|j |tj|d |jd tj\}}zyy|j|g}||j||j|f;}tj}|gtj} | d |g7} tj|| |} Wntj|YnXWdtj|X||_||_WdQXWdQXdS) 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. Nz-from multiprocessing.forkserver import main; zmain(%d, %d, %r, **%r) main_pathsys_pathignorec3s-|]#\}}|kr||fVqdS)Nr)rxy) desired_keysrrres z,ForkServer.ensure_running..r'idz-c)rrr rrrZget_preparation_datadictitemsr&r'rZarbitrary_addressZbindr(chmodZlistenr)filenoZget_executablerZ_args_from_interpreter_flagsZspawnv_passfdsr*r) rcmddatalistenerZaddressalive_rZalive_wZ fds_to_passZexeargspidr)r3rr Ss>    (       zForkServer.ensure_runningN)__name__ __module__ __qualname__rr r r r rrrrrs     rc <Cs|rd|krQ|dk rQdtj_ztj|Wdtj`Xnx4|D])}yt|WqXtk rYqXXqXWntjdk ry#tjj t t j t_Wqt tfk rYqXntjtjtj}tjtjd|}tjl}|jt_|j|tj|j|tjx-yx'dd|jD} | rXPqXqXW|| krtn|jd} d} t jdkr#zPyt| |||Wn2t k r tj!tj"tj#j$YnXWdt j%| XnWdQXWqRt&k r>YqRt k rz} z| j't'j(krhnWYdd} ~ XqRXqRWWdQXWdQXdS) zRun forkserver.rNTr8cSsg|]\}}|jqSr)Zfileobj)rkeyZeventsrrr s zmain..rr))rZcurrent_processZ _inheritingrZimport_main_path __import__ ImportErrorsysstdinr*openr(devnullOSErrorr%signalSIGCHLDSIG_IGNr&r' selectorsZDefaultSelectorZ getsockname _forkserverrregisterZ EVENT_READZselect SystemExitZacceptfork _serve_one Exception excepthookexc_infostderrflush_exitInterruptedErrorerrnoZ ECONNABORTED) Z listener_fdr<Zpreloadr.r/modnamehandlerr;ZselectorZrfdsscodeerrrmainsZ        rac Cs|jtj|tjtj|tj|td}|j|^}}t_}t_ |t j _ t |tjdtjkrddl}|jntj|} t || dS)Nrrandomr)r*r(rKrLrZrecvfdsr$rOrrrZ_semaphore_trackerZ_fdwrite_unsignedgetpidrFmodulesrbZseedr_main) r^r;r<r]r+r-r,Zstfdrbr_rrrrSs      rSc Csd}tj}xrt||krx:y tj||t|}Wntk r[Yq'XPq'W|svtdn||7}qWtj|dS)Nzunexpected EOFr)UNSIGNED_STRUCTsizer#r(readrZEOFErrorZunpack)fdr:Zlengthr^rrr read_unsigneds   rmc Cs~tj|}xh|ryx0ytj||}Wntk rEYqXPqW|dkrftdn||d}qWdS)Nrzshould not get here)rhZpackr(writerZ RuntimeError)rlnmsgnbytesrrrrcs   rc)r[r(rNrKr&ZstructrFrrrrrrr__all__r$ZStructrhobjectrrarSrmrcrOr r r r rrrrs6          h>