] @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 threadingLock_lock_preload_modules)selfr//opt/alt/python35/lib64/python3.5/forkserver.py__init__!s    zForkServer.__init__cCs5tdd|jDs(td||_dS)Ncss!|]}t|tkVqdS)N)typestr).0modrrr *sz4ForkServer.set_forkserver_preload..z&module_names must be a list of strings)allr TypeError)rZ modules_namesrrrr (s z!ForkServer.set_forkserver_preloadcCs|jS)N)r)rrrrr .szForkServer.get_inherited_fdscCs |jt|dtkr,tdtjtj}|j|jtj \}}tj \}}|||j t j g}||7}zJyt j||||fSWn%tj|tj|YnXWdtj|tj|XWdQRXdS)Nz too many fds)r lenMAXFDS_TO_SEND ValueErrorsocketAF_UNIXconnectrospiperrZgetfdrsendfdsclose)rfdsclientZparent_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 |jtj\}}zyy|j|g}||j||j|f;}tj}|gtj} | d |g7} tj|| |} Wntj|YnXWdtj|X||_||_WdQRXWdQRXdS) Nz-from multiprocessing.forkserver import main; zmain(%d, %d, %r, **%r) main_pathsys_pathignorec3s-|]#\}}|kr||fVqdS)Nr)rxy) desired_keysrrr es z,ForkServer.ensure_running..r(iz-c)rrr rrrZget_preparation_datadictitemsr'r(rarbitrary_addressbindr*chmodlistenr+filenoZget_executabler_args_from_interpreter_flagsspawnv_passfdsr-r) rcmddatalisteneraddressalive_rZalive_wZ fds_to_passZexeargspidr)r7rr Ss>    (       zForkServer.ensure_runningN)__name__ __module__ __qualname__rr r r r rrrrrs     rc4CsH|rd|krN|dk rNdtj_ztj|Wdtj`Xx1|D])}yt|WqUtk r}YqUXqUWtjt j t j t j t j i}dd|jD}tjtjd|f}tjP} |jt_| j|tj| j|tjxyx$dd| jD} | r+Pq+W|| krat|jd} d } tjdkrzPyt| |||Wn2tk rtj tj!tj"j#YnXWdtj$| XWdQRXWq%t%k r1} z| j&t&j'krWYdd} ~ Xq%Xq%WWdQRXWdQRXdS) NrTcSs+i|]!\}}tj|||qSr)signal)rsigvalrrr s zmain..r>cSsg|]\}}|jqSr)fileobj)rkeyeventsrrr s zmain..rr)(rcurrent_processZ _inheritingrZimport_main_path __import__ ImportErrorr _close_stdinrKSIGCHLDSIG_IGNSIGINTSIG_DFLr9r'r( selectorsDefaultSelector getsockname _forkserverrregister EVENT_READselect SystemExitacceptr*fork _serve_one Exceptionsys excepthookexc_infostderrflush_exitOSErrorerrnoZ ECONNABORTED)Z listener_fdrEZpreloadr2r3modnamehandlersZ old_handlersrCselectorZrfdsscodeerrrmainsR         ruc Cs|jtj|x*|jD]\}}tj||q$Wtj|td}|j|^}}t_} t_ | t j _ t |tjdtjkrddl} | jtj|} t || dS)Nrrandomr)r-r*r9rKrrecvfdsr%r^rrrZ_semaphore_trackerZ_fdwrite_unsignedgetpidrgmodulesrvseedr_main) rrrCrErprLrMr.r1r0Zstfdrvrsrrrres      recCsqd}tj}xNt||kr_tj||t|}|sRtd||7}qWtj|dS)Nzunexpected EOFr)UNSIGNED_STRUCTsizer$r*readEOFErrorunpack)fdrBlengthrrrrr read_unsigneds  rcCsZtj|}xD|rUtj||}|dkrBtd||d}qWdS)Nrzshould not get here)r~packr*write RuntimeError)rnmsgnbytesrrrrxs    rx)rnr*r[rKr'structrgrrrrrrr__all__r%Structr~objectrrurerrxr^r r r r rrrrs6          h= !