509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \ö!  ã               @   sö   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ ddlmZ d	d
ddgZdZejdƒZG dd„ deƒZddd„Zdd„ Zdd„ Zdd„ Zeƒ ZejZejZejZejZdS )é    Né   )Ú
connection)Úprocess)Ú	reduction)Úsemaphore_tracker)Úspawn)ÚutilÚensure_runningÚget_inherited_fdsÚconnect_to_new_processÚset_forkserver_preloadé   ÚQc               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú
ForkServerc             C   s.   d | _ d | _d | _d | _tjƒ | _dg| _d S )NÚ__main__)Ú_forkserver_addressÚ_forkserver_alive_fdÚ_forkserver_pidÚ_inherited_fdsÚ	threadingZLockÚ_lockÚ_preload_modules)Úself© r   ú2/usr/lib64/python3.6/multiprocessing/forkserver.pyÚ__init__!   s    
zForkServer.__init__c             C   s&   t dd„ | jD ƒƒstdƒ‚|| _dS )z>Set list of module names to try to load in forkserver process.c             s   s   | ]}t |ƒtkV  qd S )N)ÚtypeÚstr)Ú.0Úmodr   r   r   ú	<genexpr>+   s    z4ForkServer.set_forkserver_preload.<locals>.<genexpr>z&module_names must be a list of stringsN)Úallr   Ú	TypeError)r   Zmodules_namesr   r   r   r   )   s    z!ForkServer.set_forkserver_preloadc             C   s   | j S )z”Return list of fds inherited from parent process.

        This returns None if the current process was not started by fork
        server.
        )r   )r   r   r   r   r
   /   s    zForkServer.get_inherited_fdsc             C   sÎ   | j ƒ  t|ƒd tkr tdƒ‚tjtjƒ�˜}|j| jƒ tj	ƒ \}}tj	ƒ \}}||| j
tjƒ g}||7 }z<ytj||ƒ ||fS    tj|ƒ tj|ƒ ‚ Y nX W dtj|ƒ tj|ƒ X W dQ R X dS )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	   ÚlenÚMAXFDS_TO_SENDÚ
ValueErrorÚsocketÚAF_UNIXZconnectr   ÚosÚpiper   r   Zgetfdr   ZsendfdsÚclose)r   ÚfdsZclientZparent_rÚchild_wÚchild_rZparent_wZallfdsr   r   r   r   7   s&    



z!ForkServer.connect_to_new_processc                s€  | j ��n tjƒ  | jdk	rVtj| jtjƒ\}}|s8dS tj| jƒ d| _	d| _d| _d}| j
rŽddh‰ tjdƒ}t‡ fdd„|jƒ D ƒƒ}ni }tjtjƒ�Î}tjd	ƒ}|j|ƒ tj|d
ƒ |jƒ  tjƒ \}}ztyV|jƒ |g}	||jƒ || j
|f; }tjƒ }
|
gtjƒ  }|d|g7 }tj|
||	ƒ}W n   tj|ƒ ‚ Y nX W dtj|ƒ X || _	|| _|| _W dQ R X W dQ R X dS )zíMake 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; zmain(%d, %d, %r, **%r)Ú	main_pathÚsys_pathÚignorec             3   s"   | ]\}}|ˆ kr||fV  qd S )Nr   )r   ÚxÚy)Údesired_keysr   r   r    o   s    z,ForkServer.ensure_running.<locals>.<genexpr>r(   i€  z-czCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r))r   r   r	   r   r)   ÚwaitpidÚWNOHANGr+   r   r   r   r   Zget_preparation_dataÚdictÚitemsr'   r(   r   Zarbitrary_addressZbindÚchmodZlistenr*   ÚfilenoZget_executabler   Z_args_from_interpreter_flagsZspawnv_passfds)r   ÚpidZstatusÚcmdÚdataÚlistenerZaddressÚalive_rZalive_wZfds_to_passZexeÚargsr   )r4   r   r	   T   sL    

 



zForkServer.ensure_runningN)Ú__name__Ú
__module__Ú__qualname__r   r   r
   r   r	   r   r   r   r   r      s
   r   c          4   C   s  |rhd|kr8|dk	r8dt jƒ _ztj|ƒ W dt jƒ `X x.|D ]&}yt|ƒ W q> tk
rb   Y q>X q>W tjƒ  t	j
t	jt	jt	ji}dd„ |jƒ D ƒ}tjtj| d���R}tjƒ ��<}	|jƒ t_|	j|tjƒ |	j|tjƒ �xyÒxdd„ |	jƒ D ƒ}
|
räP qäW ||
k�r$tj|d	ƒd
k�s t‚t‚||
k�s2t‚|jƒ d �l}d	}tjƒ dk�r¦zFyt||||ƒ W n. tk
�r”   t j!t j"ƒ Ž  t j#j$ƒ  Y nX W dtj%|ƒ X W dQ R X W qà t&k
�ræ } z|j't'j(k�rÖ‚ W Y dd}~X qàX qàW W dQ R X W dQ R X dS )zRun forkserver.r   NTc             S   s   i | ]\}}t j ||ƒ|“qS r   )Úsignal)r   ÚsigÚvalr   r   r   ú
<dictcomp>©   s   zmain.<locals>.<dictcomp>)r:   c             S   s   g | ]\}}|j ‘qS r   )Zfileobj)r   ÚkeyZeventsr   r   r   ú
<listcomp>¶   s    zmain.<locals>.<listcomp>r   ó    r   ))r   Zcurrent_processZ_inheritingr   Zimport_main_pathÚ
__import__ÚImportErrorr   Z_close_stdinrD   ÚSIGCHLDÚSIG_IGNÚSIGINTr8   r'   r(   Ú	selectorsZDefaultSelectorZgetsocknameÚ_forkserverr   ÚregisterZ
EVENT_READZselectr)   ÚreadÚAssertionErrorÚ
SystemExitZacceptÚforkÚ
_serve_oneÚ	ExceptionÚsysÚ
excepthookÚexc_infoÚstderrÚflushÚ_exitÚOSErrorÚerrnoZECONNABORTED)Zlistener_fdr?   Zpreloadr/   r0   ÚmodnameÚhandlersZold_handlersr>   ZselectorZrfdsÚsÚcodeÚer   r   r   Úmain’   sV    





rf   c             C   s¶   |j ƒ  tj |ƒ x |jƒ D ]\}}tj||ƒ qW tj| td ƒ}| j ƒ  t|ƒtks\t‚|^}}t	_
}	t	_|	tj_t|tjƒ ƒ dtjkrždd l}
|
jƒ  tj|ƒ}t||ƒ d S )Nr   Úrandomr   )r+   r)   r8   rD   r   Zrecvfdsr%   r$   rT   rQ   r   r   r   Z_semaphore_trackerZ_fdÚwrite_unsignedÚgetpidrY   Úmodulesrg   Zseedr   Ú_main)rc   r>   r?   rb   rE   rF   r,   r.   r-   Zstfdrg   rd   r   r   r   rW   Ï   s    


rW   c             C   sR   d}t j}x8t|ƒ|k rBtj| |t|ƒ ƒ}|s8tdƒ‚||7 }qW t j|ƒd S )NrJ   zunexpected EOFr   )ÚUNSIGNED_STRUCTÚsizer$   r)   rS   ÚEOFErrorZunpack)Úfdr=   Zlengthrc   r   r   r   Úread_unsignedð   s    rp   c             C   s@   t j|ƒ}x0|r:tj| |ƒ}|dkr,tdƒ‚||d … }qW d S )Nr   zshould not get here)rl   Zpackr)   ÚwriteÚRuntimeError)ro   ÚnÚmsgÚnbytesr   r   r   rh   ú   s    
rh   )NN)r`   r)   rP   rD   r'   ZstructrY   r   Ú r   r   Úcontextr   r   r   r   Ú__all__r%   ZStructrl   Úobjectr   rf   rW   rp   rh   rQ   r	   r
   r   r   r   r   r   r   Ú<module>   s6   
s
=!
