B
    18\P/                 @   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mZ ddlm	Z	 ddddd	d
dddddddddgZ
d ZdZdZdZdZdZdZdadadd Zdd Zdd Zdd Zdd	 Zd6d d
Zd!d Ze Ze Zd"d# Zd$d Z i Z!e Z"G d%d de#Z$d7d&d'Z%d(d Z&da'eee%e	j(e	j)fd)d*Z*e+e* G d+d de#Z,G d,d dej-Z.ye /d-Z0W n e1k
r   d.Z0Y nX d/d Z2d0d1 Z3d2d3 Z4d4d5 Z5dS )8    N)_args_from_interpreter_flags   )process	sub_debugdebuginfosub_warning
get_loggerlog_to_stderrget_temp_dirregister_after_fork
is_exitingFinalizeForkAwareThreadLockForkAwareLocalclose_all_fds_exceptSUBDEBUG
SUBWARNING   
         multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc             G   s   t rt jt| f|  d S )N)_loggerlogr   )msgargs r   X/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/multiprocessing/util.pyr   ,   s    c             G   s   t rt jt| f|  d S )N)r   r   DEBUG)r   r   r   r   r   r   0   s    c             G   s   t rt jt| f|  d S )N)r   r   INFO)r   r   r   r   r   r   4   s    c             G   s   t rt jt| f|  d S )N)r   r   r   )r   r   r   r   r   r   8   s    c              C   s|   ddl } |   z\tsj| tadt_ttdrFtt	 t
t	 n$tjt	di f tjt	di f W d|   X tS )z0
    Returns logger used by multiprocessing
    r   N
unregisterr   )logging_acquireLockr   	getLoggerLOGGER_NAME	propagatehasattratexitr!   _exit_functionregisterZ_exithandlersremoveappend_releaseLock)r"   r   r   r   r	   <   s    



c             C   sJ   ddl }t }|t}| }|| || | rB||  dat	S )zB
    Turn on logging and add a handler which prints to stderr
    r   NT)
r"   r	   	FormatterDEFAULT_LOGGING_FORMATStreamHandlersetFormatter
addHandlersetLevel_log_to_stderrr   )levelr"   logger	formatterhandlerr   r   r   r
   W   s    



c              C   sd   t  jd} | d kr`dd l}dd l}|jdd} td|  td |j	| gdd | t  jd< | S )Ntempdirr   zpymp-)prefixzcreated temp directory %si)r   exitpriority)
r   current_process_configgetshutiltempfilemkdtempr   r   rmtree)r9   r?   r@   r   r   r   r   m   s    
c              C   sj   t t } |   xP| D ]H\\}}}}y|| W q tk
r` } ztd| W d d }~X Y qX qW d S )Nz after forker raised exception %s)list_afterfork_registryitemssort	Exceptionr   )rE   indexidentfuncobjer   r   r   _run_after_forkers   s    rM   c             C   s   | t ttt| |f< d S )N)rD   next_afterfork_counterid)rK   rJ   r   r   r   r      s    c               @   sF   e Zd ZdZdddZdeeejfddZ	dd	 Z
d
d Zdd ZdS )r   zA
    Class which supports object finalization using weakrefs
    r   Nc             C   s   |d k	r&t |ts&td|t||d k	r>t|| | _n|d krNtd|| _	|| _
|p`i | _|ttf| _t | _| t| j< d S )Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)
isinstanceint	TypeErrorformattypeweakrefref_weakref
ValueError	_callback_args_kwargsrN   _finalizer_counter_keyosgetpid_pid_finalizer_registry)selfrK   callbackr   kwargsr;   r   r   r   __init__   s    

zFinalize.__init__c             C   s   y|| j = W n tk
r(   |d Y nbX | j| krD|d d}n$|d| j| j| j | j| j| j}d | _ | _ | _ | _| _ |S dS )zQ
        Run the callback unless it has already been called or cancelled
        zfinalizer no longer registeredz+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %s)r^   KeyErrorra   rZ   r[   r\   rX   )rc   wrrb   r   r`   resr   r   r   __call__   s    zFinalize.__call__c             C   sD   yt | j= W n tk
r    Y n X d | _ | _ | _ | _| _dS )z3
        Cancel finalization of the object
        N)rb   r^   rg   rX   rZ   r[   r\   )rc   r   r   r   cancel   s
    zFinalize.cancelc             C   s
   | j tkS )zS
        Return whether this finalizer is still waiting to invoke callback
        )r^   rb   )rc   r   r   r   still_active   s    zFinalize.still_activec          	   C   s   y|   }W n ttfk
r(   d }Y nX |d kr>d| jj S d| jjt| jd| jf }| jrr|dt| j 7 }| j	r|dt| j	 7 }| j
d d k	r|dt| j
d  7 }|d S )	Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z	, kwargs=r   z, exitprority=>)rX   AttributeErrorrS   	__class__rm   getattrrZ   r[   strr\   r^   )rc   rK   xr   r   r   __repr__   s     
zFinalize.__repr__)r   NN)rm   
__module____qualname____doc__rf   rb   r   r_   r`   rj   rk   rl   rt   r   r   r   r   r      s   
c          	      s   t dkrdS dkrdd  nfdd  fddtt D }|jdd xX|D ]P}t |}|dk	rRtd	| y
|  W qR tk
r   d
dl}|  Y qRX qRW dkrt   dS )z
    Run all finalizers whose exit priority is not None and at least minpriority

    Finalizers with highest priority are called first; finalizers with
    the same priority will be called in reverse order of creation.
    Nc             S   s   | d d k	S )Nr   r   )pr   r   r   <lambda>       z!_run_finalizers.<locals>.<lambda>c                s   | d d k	o| d  kS )Nr   r   )rx   )minpriorityr   r   ry      rz   c                s   g | ]} |r|qS r   r   ).0key)fr   r   
<listcomp>   s    z#_run_finalizers.<locals>.<listcomp>T)reversez
calling %sr   )	rb   rC   rF   r>   r   rG   	traceback	print_excclear)r{   keysr}   	finalizerr   r   )r~   r{   r   _run_finalizers   s$    




r   c               C   s   t p
t dkS )z6
    Returns true if the process is shutting down
    N)_exitingr   r   r   r   r     s    c             C   s   t sda | d |d |d | d k	rzx*| D ] }|jr2| d|j |j  q2W x"| D ]}| d|j |  q^W |d |  d S )NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0r   z!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r   daemonname_popen	terminatejoin)r   r   r   active_childrenr<   rx   r   r   r   r)     s    	
r)   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c             C   s   |    t| tj  d S )N)_resetr   r   )rc   r   r   r   rf   N  s    zForkAwareThreadLock.__init__c             C   s"   t  | _| jj| _| jj| _d S )N)	threadingLock_lockacquirerelease)rc   r   r   r   r   R  s    

zForkAwareThreadLock._resetc             C   s
   | j  S )N)r   	__enter__)rc   r   r   r   r   W  s    zForkAwareThreadLock.__enter__c             G   s   | j j| S )N)r   __exit__)rc   r   r   r   r   r   Z  s    zForkAwareThreadLock.__exit__N)rm   ru   rv   rf   r   r   r   r   r   r   r   r   M  s   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   t | dd  d S )Nc             S   s
   | j  S )N)__dict__r   )rK   r   r   r   ry   `  rz   z)ForkAwareLocal.__init__.<locals>.<lambda>)r   )rc   r   r   r   rf   _  s    zForkAwareLocal.__init__c             C   s   t | dfS )Nr   )rU   )rc   r   r   r   
__reduce__a  s    zForkAwareLocal.__reduce__N)rm   ru   rv   rf   r   r   r   r   r   r   ^  s   SC_OPEN_MAX   c             C   sR   t | dtg } |   x4tt| d D ] }t| | d | |d   q*W d S )Nr   )rC   MAXFDrF   rangelenr_   
closerange)fdsir   r   r   r   m  s    c           	   C   s   t jd krd S yt j  W n ttfk
r4   Y nX y@ttjtj} yt| ddt _W n   t|   Y nX W n ttfk
r   Y nX d S )NF)closefd)	sysstdincloseOSErrorrY   r_   opendevnullO_RDONLY)fdr   r   r   _close_stdinw  s    

r   c            	   C   sT   yt j  W n ttfk
r&   Y nX yt j  W n ttfk
rN   Y nX d S )N)r   stdoutflushro   rY   stderrr   r   r   r   _flush_std_streams  s    r   c             C   st   dd l }tttt|}t \}}z2||t| gd|d d dddddd||ddd S t	| t	| X d S )Nr   Tr   F)
_posixsubprocesstuplesortedmaprR   r_   pipe	fork_execfsencoder   )pathr   Zpassfdsr   errpipe_readerrpipe_writer   r   r   spawnv_passfds  s    

r   )N)N)6r_   	itertoolsr   rV   r(   r   
subprocessr    r   __all__NOTSETr   r   r    r   r%   r/   r   r4   r   r   r   r   r	   r
   r   WeakValueDictionaryrD   countrO   rM   r   rb   r]   objectr   r   r   r   r   r<   r)   r*   r   localr   sysconfr   rG   r   r   r   r   r   r   r   r   <module>
   sf   


	V
,(



