
][\{)                 @   s<  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 d d  d
  Z d! d   Z e j   Z e j   Z d" d#   Z d$ d   Z i  Z  e j   Z! Gd% d   d e"  Z# d d& d'  Z$ d( d   Z% d a& e e e$ e j' e j( d) d*  Z) e j* e)  Gd+ d   d e"  Z+ Gd, d   d e j,  Z- y e  j. d-  Z/ Wn e0 k
 rd. Z/ Yn Xd/ d   Z1 d0 d1   Z2 d S)2    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   
         Zmultiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc             G   s    t  r t  j t |  |  n  d  S)N)_loggerlogr   )msgargs r   */usr/lib/python3.4/multiprocessing/util.pyr   +   s    c             G   s    t  r t  j t |  |  n  d  S)N)r   r   DEBUG)r   r   r   r   r   r   /   s    c             G   s    t  r t  j t |  |  n  d  S)N)r   r   INFO)r   r   r   r   r   r   3   s    c             G   s    t  r t  j t |  |  n  d  S)N)r   r   r   )r   r   r   r   r   r   7   s    c           
   C   s   d d l  }  |  j   z t s |  j t  a d t _ t t d  rc t j t	  t j
 t	  q t j j t	 f  i  f  t j j t	 f  i  f  n  Wd |  j   Xt S)z0
    Returns logger used by multiprocessing
    r   N
unregister)loggingZ_acquireLockr   Z	getLoggerLOGGER_NAMEZ	propagatehasattratexitr    _exit_functionregisterZ_exithandlersremoveappendZ_releaseLock)r!   r   r   r   r	   ;   s    
	 c             C   sj   d d l  } t   } | j t  } | j   } | j |  | j |  |  r` | j |   n  d a t	 S)zB
    Turn on logging and add a handler which prints to stderr
    r   NT)
r!   r	   Z	FormatterDEFAULT_LOGGING_FORMATZStreamHandlerZsetFormatterZ
addHandlerZsetLevel_log_to_stderrr   )levelr!   ZloggerZ	formatterZhandlerr   r   r   r
   V   s    	c              C   s   t  j   j j d  }  |  d  k r d d  l } d d  l } | j d d  }  t d |   t d  | j	 d |  g d d	 |  t  j   j d <n  |  S)
Ntempdirr   prefixzpymp-zcreated temp directory %sr   exitpriorityd   i)
r   current_processZ_configgetshutiltempfileZmkdtempr   r   Zrmtree)r,   r2   r3   r   r   r   r   l   s    c              C   s   t  t j    }  |  j   x` |  D]X \ \ } } } } y | |  Wq# t k
 rz } z t d |  WYd  d  } ~ Xq# Xq# Wd  S)Nz after forker raised exception %s)list_afterfork_registryitemssort	Exceptionr   )r6   indexZidentfuncobjer   r   r   _run_after_forkers~   s    
r=   c             C   s#   |  t  t t  t |   | f <d  S)N)r5   next_afterfork_counterid)r;   r:   r   r   r   r      s    c               @   sj   e  Z d  Z d Z f  d d d d  Z d e e e j d d  Z	 d d   Z
 d	 d
   Z d d   Z d S)r   zA
    Class which supports object finalization using weakrefs
    Nc             C   s   | d  k s$ t  |  t k s$ t  | d  k	 rH t j | |   |  _ n | d  k	 sZ t  | |  _ | |  _ | pu i  |  _ | t	 t
  f |  _ t j   |  _ |  t |  j <d  S)N)typeintAssertionErrorweakrefref_weakref	_callback_args_kwargsr>   _finalizer_counter_keyosgetpid_pid_finalizer_registry)selfr;   callbackr   kwargsr.   r   r   r   __init__   s    $		zFinalize.__init__c             C   s   y | |  j  =Wn t k
 r, | d  Yn X|  j |   k rR | d  d } n4 | d |  j |  j |  j  |  j |  j |  j   } d |  _ |  _ |  _ |  _ |  _  | Sd 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)rK   KeyErrorrN   rG   rH   rI   rF   )rP   wrrO   r   rM   Zresr   r   r   __call__   s    
	%zFinalize.__call__c             C   sL   y t  |  j =Wn t k
 r" Yn& Xd |  _ |  _ |  _ |  _ |  _ d S)z3
        Cancel finalization of the object
        N)rO   rK   rT   rF   rG   rH   rI   )rP   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
        )rK   rO   )rP   r   r   r   still_active   s    zFinalize.still_activec             C   s   y |  j    } Wn t t f k
 r0 d  } Yn X| d  k rA d Sd t |  j d |  j  } |  j r | d t |  j  7} n  |  j r | d t |  j  7} n  |  j d d  k	 r | d t |  j d  7} n  | d S)	Nz<Finalize object, dead>z<Finalize object, callback=%s__name__z, args=z	, kwargs=r   z, exitprority=>)	rF   AttributeError	TypeErrorgetattrrG   rH   strrI   rK   )rP   r;   xr   r   r   __repr__   s    		zFinalize.__repr__)rY   
__module____qualname____doc__rS   rO   r   rL   rM   rV   rW   rX   r`   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  j    D } | j d d  xW | D]O \ } } t d	 |  y |   Wqy t k
 r d
 d l } | j   Yqy Xqy W d k r t  j   n  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 d  k	 S)Nr   r   )pr   r   r   <lambda>   s    z!_run_finalizers.<locals>.<lambda>c                s&   |  d d d  k	 o% |  d d   k S)Nr   r   )rd   )minpriorityr   r   re      s    c                s"   g  |  ] }   |  r |  q Sr   r   ).0r_   )fr   r   
<listcomp>   s   	 z#_run_finalizers.<locals>.<listcomp>reverseTz
calling %sr   )	rO   r4   r6   r7   r   r8   	traceback	print_excclear)rf   r6   keyZ	finalizerrk   r   )rh   rf   r   _run_finalizers   s     %ro   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  s d a  |  d  | d  | d  |   d  k	 r x: |   D]/ } | j rC |  d | j  | j j   qC qC Wx. |   D]  } |  d | j  | j   q Wn  | d  |   n  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)rp   ZdaemonnameZ_popenZ	terminatejoin)r   r   ro   active_childrenr0   rd   r   r   r   r%     s    	


	
r%   c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             C   s   |  j    t |  t j   d  S)N)_resetr   r   )rP   r   r   r   rS   A  s    
zForkAwareThreadLock.__init__c             C   s1   t  j   |  _ |  j j |  _ |  j j |  _ d  S)N)	threadingZLock_lockacquirerelease)rP   r   r   r   rt   E  s    zForkAwareThreadLock._resetN)rY   ra   rb   rS   rt   r   r   r   r   r   @  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  j   S)N)__dict__rm   )r;   r   r   r   re   L  s    z)ForkAwareLocal.__init__.<locals>.<lambda>)r   )rP   r   r   r   rS   K  s    zForkAwareLocal.__init__c             C   s   t  |   f  f S)N)rA   )rP   r   r   r   
__reduce__M  s    zForkAwareLocal.__reduce__N)rY   ra   rb   rS   rz   r   r   r   r   r   J  s   SC_OPEN_MAX   c             C   s   t  |   d t g }  |  j   |  d t k s< t d   x> t t |   d  D]& } t j |  | d |  | d  qS Wd  S)Nr   zfd too larger}   )r4   MAXFDr7   rC   rangelenrL   
closerange)Zfdsir   r   r   r   Y  s
    
c             C   s   d d  l  } t |  } t j   \ } } zM | j | t j |   g d | d  d  d d d d d	 d
 | | d d d   SWd  t j |  t j |  Xd  S)Nr   Tr   Fr}   r}   r}   r}   r}   r}   )_posixsubprocesssortedrL   pipeZ	fork_execfsencodeclose)pathr   Zpassfdsr   Zerrpipe_readZerrpipe_writer   r   r   spawnv_passfdsd  s    r   )3rL   	itertoolsrD   r$   ru   
subprocessr    r   __all__ZNOTSETr   r   r   r   r"   r)   r   r*   r   r   r   r   r	   r
   r   WeakValueDictionaryr5   countr?   r=   r   rO   rJ   objectr   ro   r   rp   rs   r0   r%   r&   r   Zlocalr   sysconfr~   r8   r   r   r   r   r   r   <module>
   s`   		R$	(

