B
    u9a                 @   s  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mZ yd dlmZ W n  ek
r|   d dlmZ Y nX ddd	d
dddddddddddddddddgZejZejZejZejZejZy
ej Z!W n e"k
r   dZ!Y nX ej#Z#[da$da%dd Z&dd Z'eZ(dd Z G dd  d Z)e)Z*G d!d	 d	Z+G d"d dZ,G d#d de,Z-G d$d dZ.G d%d dZ/G d&d de0Z1e j2Z3e3  d?d(d)Z4e a5i Z6i Z7e Z8e a9e: a;G d*d dZ<G d+d de<Z=G d,d- d-e<Z>G d.d/ d/e<Z?d0d
 Z@e@ZAd1d ZBeBZCd2d3 ZDd4d ZEd d5lmFZF e> aGd6d7 ZHd8d ZIyd d9lmJZK W n" ek
rv   d d:lLmKZK Y nX d;d< ZMeNed=rejOeMd> dS )@    N)	monotonic)
format_exc)WeakSet)islicecount)deque	get_identactive_count	Conditioncurrent_thread	enumeratemain_threadTIMEOUT_MAXEventLockRLock	SemaphoreBoundedSemaphoreThreadBarrierBrokenBarrierErrorTimerThreadError
setprofilesettracelocal
stack_sizec             C   s   | a d S )N)_profile_hook)func r   /usr/lib/python3.7/threading.pyr   3   s    c             C   s   | a d S )N)_trace_hook)r   r   r   r    r   =   s    c              O   s   t d krt| |S t | |S )N)_CRLock_PyRLock)argskwargsr   r   r    r   K   s    	
c               @   sR   e Zd Zdd Zdd ZdddZeZd	d
 Zdd Zdd Z	dd Z
dd ZdS )_RLockc             C   s   t  | _d | _d| _d S )Nr   )_allocate_lock_block_owner_count)selfr   r   r    __init__b   s    z_RLock.__init__c          	   C   s^   | j }yt| j}W n tk
r(   Y nX d| j r:dnd| jj| jj|| j	t
t| f S )Nz)<%s %s.%s object owner=%r count=%d at %s>lockedZunlocked)r)   _activenameKeyErrorr(   r-   	__class__
__module____qualname__r*   hexid)r+   ownerr   r   r    __repr__g   s    z_RLock.__repr__Tc             C   sD   t  }| j|kr"|  jd7  _dS | j||}|r@|| _d| _|S )N   )r   r)   r*   r(   acquire)r+   blockingtimeoutmercr   r   r    r:   v   s    
z_RLock.acquirec             C   s<   | j t krtd| jd  | _}|s8d | _ | j  d S )Nzcannot release un-acquired lockr9   )r)   r   RuntimeErrorr*   r(   release)r+   r   r   r   r    r@      s    z_RLock.releasec             C   s   |    d S )N)r@   )r+   tvtbr   r   r    __exit__   s    z_RLock.__exit__c             C   s   | j   |\| _| _d S )N)r(   r:   r*   r)   )r+   stater   r   r    _acquire_restore   s    
z_RLock._acquire_restorec             C   s<   | j dkrtd| j }d| _ | j}d | _| j  ||fS )Nr   zcannot release un-acquired lock)r*   r?   r)   r(   r@   )r+   r   r6   r   r   r    _release_save   s    

z_RLock._release_savec             C   s   | j t kS )N)r)   r   )r+   r   r   r    	_is_owned   s    z_RLock._is_ownedN)Tr8   )__name__r2   r3   r,   r7   r:   	__enter__r@   rD   rF   rG   rH   r   r   r   r    r&   X   s   

$
r&   c               @   sp   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dddZ
dddZdddZdd ZeZdS )r
   Nc             C   s   |d krt  }|| _|j| _|j| _y|j| _W n tk
rD   Y nX y|j| _W n tk
rf   Y nX y|j| _W n tk
r   Y nX t | _	d S )N)
r   _lockr:   r@   rG   AttributeErrorrF   rH   _deque_waiters)r+   lockr   r   r    r,      s$    zCondition.__init__c             C   s
   | j  S )N)rK   rJ   )r+   r   r   r    rJ      s    zCondition.__enter__c             G   s   | j j| S )N)rK   rD   )r+   r$   r   r   r    rD      s    zCondition.__exit__c             C   s   d| j t| jf S )Nz<Condition(%s, %d)>)rK   lenrN   )r+   r   r   r    r7      s    zCondition.__repr__c             C   s   | j   d S )N)rK   r@   )r+   r   r   r    rG      s    zCondition._release_savec             C   s   | j   d S )N)rK   r:   )r+   xr   r   r    rF      s    zCondition._acquire_restorec             C   s"   | j dr| j   dS dS d S )Nr   FT)rK   r:   r@   )r+   r   r   r    rH      s    
zCondition._is_ownedc             C   s   |   stdt }|  | j| |  }d}z:|d krN|  d}n |dkrd|d|}n
|d}|S | | |sy| j| W n t	k
r   Y nX X d S )Nzcannot wait on un-acquired lockFTr   )
rH   r?   r'   r:   rN   appendrG   rF   remove
ValueError)r+   r<   waiterZsaved_stateZgotitr   r   r    wait  s*    

zCondition.waitc             C   s\   d }|}| }xH|sV|d k	rD|d kr0t  | }n|t   }|dkrDP | | | }qW |S )Nr   )_timerV   )r+   Z	predicater<   endtimeZwaittimeresultr   r   r    wait_for8  s    


zCondition.wait_forr9   c          	   C   sj   |   std| j}tt||}|s,d S x8|D ]0}|  y|| W q2 tk
r`   Y q2X q2W d S )Nz!cannot notify on un-acquired lock)rH   r?   rN   rM   _islicer@   rS   rT   )r+   nZall_waitersZwaiters_to_notifyrU   r   r   r    notifyO  s    

zCondition.notifyc             C   s   |  t| j d S )N)r]   rP   rN   )r+   r   r   r    
notify_allf  s    zCondition.notify_all)N)N)N)r9   )rI   r2   r3   r,   rJ   rD   r7   rG   rF   rH   rV   rZ   r]   r^   Z	notifyAllr   r   r   r    r
      s   
	
0

	c               @   s4   e Zd ZdddZdddZeZdd	 Zd
d ZdS )r   r9   c             C   s&   |dk rt dtt | _|| _d S )Nr   z$semaphore initial value must be >= 0)rT   r
   r   _cond_value)r+   valuer   r   r    r,   ~  s    zSemaphore.__init__TNc          	   C   s   |s|d k	rt dd}d }| jj xb| jdkrt|s6P |d k	rf|d krRt | }n|t  }|dkrfP | j| q&W |  jd8  _d}W d Q R X |S )Nz.can't specify timeout for non-blocking acquireFr   r9   T)rT   r_   r`   rW   rV   )r+   r;   r<   r>   rX   r   r   r    r:     s$    
zSemaphore.acquirec          	   C   s.   | j  |  jd7  _| j   W d Q R X d S )Nr9   )r_   r`   r]   )r+   r   r   r    r@     s    zSemaphore.releasec             C   s   |    d S )N)r@   )r+   rA   rB   rC   r   r   r    rD     s    zSemaphore.__exit__)r9   )TN)rI   r2   r3   r,   r:   rJ   r@   rD   r   r   r   r    r   r  s
   

-c               @   s   e Zd ZdddZdd ZdS )r   r9   c             C   s   t | | || _d S )N)r   r,   _initial_value)r+   ra   r   r   r    r,     s    zBoundedSemaphore.__init__c          	   C   sB   | j 2 | j| jkrtd|  jd7  _| j   W d Q R X d S )Nz!Semaphore released too many timesr9   )r_   r`   rb   rT   r]   )r+   r   r   r    r@     s
    
zBoundedSemaphore.releaseN)r9   )rI   r2   r3   r,   r@   r   r   r   r    r     s   
c               @   sB   e Zd Zdd Zdd Zdd ZeZdd Zd	d
 ZdddZ	dS )r   c             C   s   t t | _d| _d S )NF)r
   r   r_   _flag)r+   r   r   r    r,     s    zEvent.__init__c             C   s   | j t  d S )N)r_   r,   r   )r+   r   r   r    _reset_internal_locks  s    zEvent._reset_internal_locksc             C   s   | j S )N)rc   )r+   r   r   r    is_set  s    zEvent.is_setc          	   C   s&   | j  d| _| j   W d Q R X d S )NT)r_   rc   r^   )r+   r   r   r    set  s    z	Event.setc          	   C   s   | j  d| _W d Q R X d S )NF)r_   rc   )r+   r   r   r    clear  s    zEvent.clearNc          	   C   s,   | j  | j}|s| j |}|S Q R X d S )N)r_   rc   rV   )r+   r<   Zsignaledr   r   r    rV     s
    z
Event.wait)N)
rI   r2   r3   r,   rd   re   ZisSetrf   rg   rV   r   r   r   r    r     s   
c               @   s|   e Zd ZdddZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zedd Zedd Zedd ZdS )r   Nc             C   s.   t t | _|| _|| _|| _d| _d| _d S )Nr   )r
   r   r_   _action_timeout_parties_stater*   )r+   partiesactionr<   r   r   r    r,   @  s    	zBarrier.__init__c          
   C   s   |d kr| j }| jb |   | j}|  jd7  _z&|d | jkrL|   n
| | |S |  jd8  _|   X W d Q R X d S )Nr9   )ri   r_   _enterr*   rj   _release_wait_exit)r+   r<   indexr   r   r    rV   P  s    	

zBarrier.waitc             C   s,   x| j dkr| j  qW | j dk r(td S )N)r8   r9   r   )rk   r_   rV   r   )r+   r   r   r    rn   n  s
    
zBarrier._enterc             C   s>   y"| j r|    d| _| j  W n   |    Y nX d S )Nr9   )rh   rk   r_   r^   _break)r+   r   r   r    ro   y  s    zBarrier._releasec                s4    j  fdd|s"   t jdk r0td S )Nc                  s
    j dkS )Nr   )rk   r   )r+   r   r    <lambda>      zBarrier._wait.<locals>.<lambda>r   )r_   rZ   rs   r   rk   )r+   r<   r   )r+   r    rp     s    
zBarrier._waitc             C   s(   | j dkr$| jdkr$d| _| j  d S )Nr   )r8   r9   )r*   rk   r_   r^   )r+   r   r   r    rq     s    

zBarrier._exitc          	   C   sT   | j D | jdkr6| jdkr$d| _q<| jdkr<d| _nd| _| j   W d Q R X d S )Nr   r8   )r_   r*   rk   r^   )r+   r   r   r    reset  s    


zBarrier.resetc          	   C   s   | j  |   W d Q R X d S )N)r_   rs   )r+   r   r   r    abort  s    zBarrier.abortc             C   s   d| _ | j  d S )Nrv   )rk   r_   r^   )r+   r   r   r    rs     s    zBarrier._breakc             C   s   | j S )N)rj   )r+   r   r   r    rl     s    zBarrier.partiesc             C   s   | j dkr| jS dS )Nr   )rk   r*   )r+   r   r   r    	n_waiting  s    
zBarrier.n_waitingc             C   s
   | j dkS )Nrv   )rk   )r+   r   r   r    broken  s    zBarrier.broken)NN)N)rI   r2   r3   r,   rV   rn   ro   rp   rq   rw   rx   rs   propertyrl   ry   rz   r   r   r   r    r   7  s   	


	c               @   s   e Zd ZdS )r   N)rI   r2   r3   r   r   r   r    r     s   	Thread-%dc             C   s
   | t   S )N)_counter)templater   r   r    _newname  s    r   c               @   s   e Zd ZdZejZd5ddddZdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd6ddZd7dd Zed!d" Zejd#d" Zed$d% Zd&d' Zd(d) Zed*d+ Zejd,d+ Zd-d. Zd/d0 Zd1d2 Zd3d4 ZdS )8r   FNr   )daemonc            C   s~   |d kri }|| _ t|pt | _|| _|| _|d k	r>|| _n
t j| _d | _	d | _
t | _d| _d| _tj| _t|  d S )NFT)_targetstrr   _name_args_kwargs	_daemonicr   r   _ident_tstate_lockr   _started_is_stopped_initialized_sysstderr_stderr	_danglingadd)r+   grouptargetr/   r$   r%   r   r   r   r    r,     s     
zThread.__init__c             C   s(   | j   |r|   nd| _d | _d S )NT)r   rd   _set_tstate_lockr   r   )r+   is_aliver   r   r    rd   (  s
    

zThread._reset_internal_locksc             C   s^   d}| j  rd}|   | jr$d}| jr2|d7 }| jd k	rJ|d| j 7 }d| jj| j|f S )NinitialZstartedZstoppedz daemonz %sz<%s(%s, %s)>)	r   re   r   r   r   r   r1   rI   r   )r+   statusr   r   r    r7   4  s    

zThread.__repr__c             C   s   | j std| j r tdt | t| < W d Q R X yt| jd W n, tk
rt   t t| = W d Q R X  Y nX | j	  d S )Nzthread.__init__() not calledz threads can only be started oncer   )
r   r?   r   re   _active_limbo_lock_limbo_start_new_thread
_bootstrap	ExceptionrV   )r+   r   r   r    startB  s    

zThread.startc             C   s.   z| j r| j | j| j W d | ` | `| `X d S )N)r   r   r   )r+   r   r   r    run[  s    	z
Thread.runc             C   s2   y|    W n    | jr&td kr&d S  Y nX d S )N)_bootstrap_innerr   r   )r+   r   r   r    r   l  s    zThread._bootstrapc             C   s   t  | _d S )N)r   r   )r+   r   r   r    
_set_ident  s    zThread._set_identc          	   C   s8   t  | _| j  | js4t t| j W d Q R X d S )N)_set_sentinelr   r:   r   _shutdown_locks_lock_shutdown_locksr   )r+   r   r   r    r     s
    
zThread._set_tstate_lockc             C   s  z`|    |   | j  t | t| j< t| = W d Q R X trLt	
t trZt	t z y|   W n tk
r~   Y n   t	rt	jd k	rtd| jt f t	jd n| jd k	rT|  \}}}ztd| j d | jd td| jd x6|r&td|jjj|j|jjjf | jd |j}qW td||f | jd | j  W d ~~~X Y nX W d X W d t  ytt = W n   Y nX W d Q R X X d S )NzException in thread %s:
%s)filezException in thread z2 (most likely raised during interpreter shutdown):z"Traceback (most recent call last):z  File "%s", line %s, in %sz%s: %s)r   r   r   rf   r   r.   r   r   r!   r   r   r   r   r   
SystemExitr   printr/   _format_excr   	_exc_infotb_framef_codeco_filename	tb_linenoco_nametb_nextflushr   )r+   exc_type	exc_valueZexc_tbr   r   r    r     sV    




zThread._bootstrap_innerc          	   C   s>   | j }|d k	rd| _d | _ | js:t t| W d Q R X d S )NT)r   r   r   r   r   discard)r+   rO   r   r   r    _stop  s    zThread._stopc          	   C   s   t  tt = W d Q R X d S )N)r   r.   r   )r+   r   r   r    _delete  s    zThread._deletec             C   sZ   | j std| j s td| t kr2td|d krD|   n| jt|dd d S )NzThread.__init__() not calledz'cannot join thread before it is startedzcannot join current threadr   )r<   )r   r?   r   re   r   _wait_for_tstate_lockmax)r+   r<   r   r   r    join  s    


zThread.joinTr8   c             C   s0   | j }|d krn|||r,|  |   d S )N)r   r:   r@   r   )r+   blockr<   rO   r   r   r    r     s    zThread._wait_for_tstate_lockc             C   s   | j S )N)r   )r+   r   r   r    r/   (  s    	zThread.namec             C   s   t || _d S )N)r   r   )r+   r/   r   r   r    r/   3  s    c             C   s   | j S )N)r   )r+   r   r   r    ident8  s    
zThread.identc             C   s&   | j s| j sdS | d | j  S )NF)r   r   re   r   )r+   r   r   r    r   D  s    	
zThread.is_alivec             C   s    dd l }|jdtdd |  S )Nr   z/isAlive() is deprecated, use is_alive() instead   )
stacklevel)warningswarnPendingDeprecationWarningr   )r+   r   r   r   r    isAliveR  s    
zThread.isAlivec             C   s   | j S )N)r   )r+   r   r   r    r   \  s    zThread.daemonc             C   s*   | j std| j r td|| _d S )NzThread.__init__() not calledz)cannot set daemon status of active thread)r   r?   r   re   r   )r+   daemonicr   r   r    r   l  s
    
c             C   s   | j S )N)r   )r+   r   r   r    isDaemont  s    zThread.isDaemonc             C   s
   || _ d S )N)r   )r+   r   r   r   r    	setDaemonw  s    zThread.setDaemonc             C   s   | j S )N)r/   )r+   r   r   r    getNamez  s    zThread.getNamec             C   s
   || _ d S )N)r/   )r+   r/   r   r   r    setName}  s    zThread.setName)NNNr   N)N)Tr8   )rI   r2   r3   r   r   exc_infor   r,   rd   r7   r   r   r   r   r   r   r   r   r   r   r{   r/   setterr   r   r   r   r   r   r   r   r   r   r   r    r     s6   	 ,B	
&

c               @   s&   e Zd ZdddZdd Zdd ZdS )	r   Nc             C   sF   t |  || _|| _|d k	r"|ng | _|d k	r4|ni | _t | _d S )N)r   r,   intervalfunctionr$   r%   r   finished)r+   r   r   r$   r%   r   r   r    r,     s    
zTimer.__init__c             C   s   | j   d S )N)r   rf   )r+   r   r   r    cancel  s    zTimer.cancelc             C   s6   | j | j | j  s(| j| j| j | j   d S )N)r   rV   r   re   r   r$   r%   rf   )r+   r   r   r    r     s    
z	Timer.run)NN)rI   r2   r3   r,   r   r   r   r   r   r    r     s   	
c               @   s   e Zd Zdd ZdS )_MainThreadc          	   C   sH   t j| ddd |   | j  |   t | t| j< W d Q R X d S )NZ
MainThreadF)r/   r   )	r   r,   r   r   rf   r   r   r.   r   )r+   r   r   r    r,     s    
z_MainThread.__init__N)rI   r2   r3   r,   r   r   r   r    r     s   r   c               @   s.   e Zd Zdd Zdd Zdd Zd
dd	ZdS )_DummyThreadc          	   C   sD   t j| tddd | j  |   t | t| j< W d Q R X d S )NzDummy-%dT)r/   r   )	r   r,   r   r   rf   r   r   r.   r   )r+   r   r   r    r,     s
    
z_DummyThread.__init__c             C   s   d S )Nr   )r+   r   r   r    r     s    z_DummyThread._stopc             C   s   dS )NTr   )r+   r   r   r    r     s    z_DummyThread.is_aliveNc             C   s   d S )Nr   )r+   r<   r   r   r    r     s    z_DummyThread.join)N)rI   r2   r3   r,   r   r   r   r   r   r   r    r     s   r   c               C   s&   y
t t  S  tk
r    t S X d S )N)r.   r   r0   r   r   r   r   r    r     s    
c            	   C   s    t  tttt S Q R X d S )N)r   rP   r.   r   r   r   r   r    r	     s    c               C   s   t t t t  S )N)listr.   valuesr   r   r   r   r    
_enumerate  s    r   c            	   C   s(   t  tt tt  S Q R X d S )N)r   r   r.   r   r   r   r   r   r    r     s    )r   c           	   C   sn   t jr
d S t j} |   t   xHt tt}t  W d Q R X |sHP x|D ]}|	  |  qNW q"W d S )N)
_main_threadr   r   r@   r   r   r   r   rg   r:   )ZtlockZlocksrO   r   r   r    	_shutdown  s    	
r   c               C   s   t S )N)r   r   r   r   r    r   #  s    )_local)r   c           	   C   s   t  ai } t }|at  at at| tt }|t	 xF|D ]>}||krl|
d t }||_|| |< q@|
d |  q@W t  t  t|  W d Q R X d S )NTF)r'   r   r   r   r   rf   r   r   updater   rd   r   r   r   r   rg   r.   )Z
new_activeZcurrentZthreadsZthreadr   r   r   r    _after_fork4  s*    






r   register_at_fork)Zafter_in_child)r|   )Pos_ossysr   _threadZtimer   rW   	tracebackr   r   Z_weakrefsetr   	itertoolsr   r[   r   r*   _collectionsr   rM   ImportErrorcollections__all__start_new_threadr   allocate_lockr'   r   r   errorr   r   r"   rL   r   r   r!   r   r   r   r&   r#   r
   r   r   r   r   r?   r   __next__r}   r   r   r.   r   r   r   rf   r   r   r   r   r   r   ZcurrentThreadr	   ZactiveCountr   r   r   r   r   r   r   r   Z_threading_localr   hasattrr   r   r   r   r    <module>   s   


q 'P&O 
   
(-