£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     fq0                 @   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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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               @   sD   e Zd Zdd Zd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 | _dg| _d S )N__main__)_forkserver_address_forkserver_alive_fd_forkserver_pid_inherited_fds	threadingZLock_lock_preload_modules)self r   ?/opt/alt/python37/lib64/python3.7/multiprocessing/forkserver.py__init__"   s    
zForkServer.__init__c          	   C   s   | j  |   W d Q R X d S )N)r   _stop_unlocked)r   r   r   r   _stop*   s    zForkServer._stopc             C   sJ   | j d krd S t| j d | _t| j d d | _ t| j d | _d S )Nr   )r   oscloser   waitpidunlinkr   )r   r   r   r   r   /   s    
zForkServer._stop_unlockedc             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 )zReturn 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
   C   s    zForkServer.get_inherited_fdsc          
   C   s   |    t|d tkr tdttj}|| j t	 \}}t	 \}}||| j
t g}||7 }z<yt|| ||fS    t| t|  Y nX W dt| t| 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   r   piper   r   Zgetfdr   Zsendfdsr   )r   fdsZclientZparent_rchild_wchild_rZparent_wZallfdsr   r   r   r   K   s&    



z!ForkServer.connect_to_new_processc                s  | j t t  | jdk	rVt| jtj\}}|s8dS t| j d| _	d| _d| _d}| j
rddh td} fdd| D }ni }ttj}td}|| t|st|d	 |  t \}}ztyV| |g}	|| || j
|f; }t }
|
gt  }|d
|g7 }t|
||	}W n   t|  Y nX W dt| X || _	|| _|| _W dQ R X W dQ R X dS )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.
        NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)	main_pathsys_pathignorec                s   i | ]\}}| kr||qS r   r   )r$   xy)desired_keysr   r   
<dictcomp>   s    z-ForkServer.ensure_running.<locals>.<dictcomp>r.   i  z-c)r   r   r	   r   r   r    WNOHANGr   r   r   r   r   Zget_preparation_dataitemsr-   r.   r   Zarbitrary_addressZbindr   Zis_abstract_socket_namespacechmodZlistenr/   filenoZget_executableZ_args_from_interpreter_flagsZspawnv_passfds)r   pidZstatuscmddatalistenerZaddressalive_rZalive_wZfds_to_passZexeargsr   )r8   r   r	   h   sL    






zForkServer.ensure_runningN)
__name__
__module____qualname__r   r   r   r   r
   r   r	   r   r   r   r   r       s   r   c             C   s  |rhd|kr8|dk	r8dt  _zt| W dt  `X x.|D ]&}yt| W q> tk
rb   Y q>X q>W t  t	
 \}}t	|d t	|d dd }tj|tjtji}	dd |	 D }
t| i }tjtj| d	}t }| t_||tj ||tj ||tj xʐyx d
d | D }|r,P q,W ||krtt	|ddksptdt||krdt	|d xyt	dt	j \}}W n t!k
r   P Y nX |dkrP |"|d}|dk	rPt	#|rt	$| }n&t	%|std&||t	'|}yt(|| W n t)k
rB   Y nX t	*| nt+,d|  qW ||kr|- d 0}t./|t0d }t1|t0krt2d&t1||^}}}|*  t	3 }|dkrVd}zpy<|*  |*  ||||g}|4|5  t6||||
}W n. t7k
rB   t8j9t8:   t8j;<  Y nX W dt	=| X nRyt(|| W n t)k
rz   Y nX |||< t	*| x|D ]}t	*| qW W dQ R X W n4 t>k
r } z|j?t?j@kr؂ W dd}~X Y nX q&W W dQ R X W dQ R X dS )zRun forkserver.r   NTFc              W   s   d S )Nr   )Z_unusedr   r   r   sigchld_handler   s    zmain.<locals>.sigchld_handlerc             S   s   i | ]\}}t  |||qS r   )signal)r$   sigvalr   r   r   r9      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       zNot at EOF?i   r   zChild {0:n} status is {1:n}z.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)Ar   Zcurrent_processZ_inheritingr   Zimport_main_path
__import__ImportErrorr   Z_close_stdinr   r/   set_blockingrH   SIGCHLDSIGINTSIG_IGNr;   set_wakeup_fdr-   r.   	selectorsZDefaultSelectorZgetsockname_forkserverr   registerZ
EVENT_READZselectreadAssertionError
SystemExitr    r:   ChildProcessErrorpopWIFSIGNALEDWTERMSIG	WIFEXITEDformatWEXITSTATUSwrite_signedBrokenPipeErrorr   warningswarnZacceptr   Zrecvfdsr+   r*   RuntimeErrorforkextendvalues
_serve_one	Exceptionsys
excepthookexc_infostderrflush_exitOSErrorerrnoZECONNABORTED)Zlistener_fdrB   Zpreloadr3   r4   modnameZsig_rZsig_wrG   handlersZold_handlersZ	pid_to_fdrA   ZselectorZrfdsr>   stsr1   
returncodesr0   r2   code
unused_fdsfder   r   r   main   s    

















r~   c             C   sd   t d x | D ]\}}t  || qW x|D ]}t| q2W |^t_tj_	t_
t| }|S )NrN   )rH   rU   r;   r   r   rW   r   r   Z_semaphore_trackerZ_fdr   r   _main)r2   r0   r{   rv   rI   rJ   r|   rz   r   r   r   rk   0  s    


rk   c             C   sR   d}t j}x8t||k rBt| |t| }|s8td||7 }qW t |d S )NrM   zunexpected EOFr   )SIGNED_STRUCTsizer*   r   rY   EOFErrorZunpack)r|   r@   lengthry   r   r   r   read_signedF  s    r   c             C   s@   t |}x0|r:t| |}|dkr,td||d  }qW d S )Nr   zshould not get here)r   Zpackr   writerg   )r|   nmsgnbytesr   r   r   rc   P  s    
rc   )NN) rt   r   rV   rH   r-   Zstructrm   r   re    r   r   contextr   r   r   r   __all__r+   ZStructr   objectr   r~   rk   r   rc   rW   r	   r
   r   r   r   r   r   r   <module>   s<   
 
 
