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|}tj}|jt_|j|tj|j|tjx]yx'dd|jD} | rXPqXqXW|| krt j|ddksttn|| kst|jd } d} t j d krSzPyt!| |||Wn2t"k r=tj#tj$tj%j&YnXWdt j'| XnWdQXWqRt(k rnYqRt k r} z| j)t)j*krnWYdd} ~ 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_READZselectreadAssertionError SystemExitZacceptfork _serve_one Exception excepthookexc_infostderrflush_exitInterruptedErrorerrnoZ ECONNABORTED) Z listener_fdr<Zpreloadr.r/modnamehandlerr;ZselectorZrfdsscodeerrrmains^        rdc Cs|jtj|tjtj|tj|td}|jt|tksbt|^}}t _ }t _ |t j _t|tjdtjkrddl}|jntj|} t|| dS)Nrrandomr)r*r(rLrMrZrecvfdsr$r#rSrPrrrZ_semaphore_trackerZ_fdwrite_unsignedgetpidrGmodulesreZseedr_main) rar;r<r`r+r-r,ZstfdrerbrrrrVs      rVc Csd}tj}xrt||krx:y tj||t|}Wntk r[Yq'XPq'W|svtdn||7}qWtj|dS)NrDzunexpected EOFr)UNSIGNED_STRUCTsizer#r(rRr]EOFErrorZunpack)fdr:Zlengthrarrr read_unsigneds   rnc Cs~tj|}xh|ryx0ytj||}Wntk rEYqXPqW|dkrftdn||d}qWdS)Nrzshould not get here)rjZpackr(writer] RuntimeError)rmnmsgnbytesrrrrfs   rf)r^r(rOrLr&ZstructrGrrrrrrr__all__r$ZStructrjobjectrrdrVrnrfrPr r r r rrrrs6          h>