a
    ze                     @   s  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mZ zd dlmZ W n eyv   d dlmZ Y n0 g dZejZejZejZejZzejZdZed W n ey   d	ZY n0 ej Z!z
ej"Z#W n ey   dZ#Y n0 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Z0G dd de1Z2e j3Z4e4  dJdd Z5e" a6i Z7i Z8e
 Z9e a:e; a<d!d" Z=G d#d$ d$Z>zd d%lm?a@mAZB W nF ey.   d d&lCmDZE d d'lmFZF eFd(d)ZAd*d( ZBd+d, a@Y n0 d-d. ZGG d/d0 d0e>ZHG d1d2 d2e>ZIG d3d4 d4e>ZJd5d6 ZKeKZLd7d8 ZMeMZNd9d: ZOd;d< ZPg ZQd	aRd=d> ZSd d?lmTZT eI aUd@dA ZVdBdC ZWzd dDlmXZY W n  ey   d dElZmYZY Y n0 dFdG Z[e\edHrej]e[dI dS )K    N)	monotonic)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_size
excepthookExceptHookArgsTget_native_idFc                 C   s   | a d S N)_profile_hookfunc r#   /usr/lib/python3.9/threading.pyr   :   s    r   c                 C   s   | a d S r   )_trace_hookr!   r#   r#   r$   r   D   s    r   c                  O   s$   t d u rt| i |S t | i |S r   )_CRLock_PyRLock)argskwargsr#   r#   r$   r   R   s    	r   c                   @   sZ   e Zd Zd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__i   s    z_RLock.__init__c              	   C   s\   | j }zt| j}W n ty&   Y n0 d| j r8dnd| jj| jj|| j	t
t| f S )Nz)<%s %s.%s object owner=%r count=%d at %s>lockedunlocked)r.   _activenameKeyErrorr-   r3   	__class__
__module____qualname__r/   hexid)r1   ownerr#   r#   r$   __repr__n   s    
z_RLock.__repr__c                 C   s   | j   d | _d| _d S r+   )r-   _at_fork_reinitr.   r/   r0   r#   r#   r$   r?   }   s    
z_RLock._at_fork_reinitTc                 C   sD   t  }| j|kr"|  jd7  _dS | j||}|r@|| _d| _|S N   )r   r.   r/   r-   acquire)r1   blockingtimeoutmercr#   r#   r$   rC      s    
z_RLock.acquirec                 C   s<   | j t krtd| jd  | _}|s8d | _ | j  d S )Ncannot release un-acquired lockrB   )r.   r   RuntimeErrorr/   r-   release)r1   r   r#   r#   r$   rJ      s    z_RLock.releasec                 C   s   |    d S r   rJ   r1   tvtbr#   r#   r$   __exit__   s    z_RLock.__exit__c                 C   s   | j   |\| _| _d S r   )r-   rC   r/   r.   )r1   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   rH   )r/   rI   r.   r-   rJ   )r1   r   r=   r#   r#   r$   _release_save   s    

z_RLock._release_savec                 C   s   | j t kS r   )r.   r   r0   r#   r#   r$   	_is_owned   s    z_RLock._is_ownedN)Tr@   )__name__r9   r:   r2   r>   r?   rC   	__enter__rJ   rP   rR   rS   rT   r#   r#   r#   r$   r*   _   s   

$
r*   c                   @   sx   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 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 u rt  }|| _|j| _|j| _z|j| _W n tyB   Y n0 z|j| _W n tyb   Y n0 z|j| _W n ty   Y n0 t | _	d S r   )
r   _lockrC   rJ   rS   AttributeErrorrR   rT   _deque_waitersr1   lockr#   r#   r$   r2      s$    zCondition.__init__c                 C   s   | j   | j  d S r   )rW   r?   rZ   clearr0   r#   r#   r$   r?      s    
zCondition._at_fork_reinitc                 C   s
   | j  S r   )rW   rV   r0   r#   r#   r$   rV      s    zCondition.__enter__c                 G   s   | j j| S r   )rW   rP   )r1   r(   r#   r#   r$   rP     s    zCondition.__exit__c                 C   s   d| j t| jf S )Nz<Condition(%s, %d)>)rW   lenrZ   r0   r#   r#   r$   r>     s    zCondition.__repr__c                 C   s   | j   d S r   )rW   rJ   r0   r#   r#   r$   rS   	  s    zCondition._release_savec                 C   s   | j   d S r   )rW   rC   )r1   xr#   r#   r$   rR     s    zCondition._acquire_restorec                 C   s"   | j dr| j   dS dS d S NFT)rW   rC   rJ   r0   r#   r#   r$   rT     s    
zCondition._is_ownedc                 C   s  |   stdt }|  | j| |  }d}z|d u rN|  d}n |dkrd|d|}n
|d}|W | | |sz| j| W S  t	y   Y S 0 S z| j| W n t	y   Y n0 n8| | |sz| j| W n t	y    Y n0 0 d S )Nzcannot wait on un-acquired lockFTr   )
rT   rI   r,   rC   rZ   appendrS   rR   remove
ValueError)r1   rE   waitersaved_stategotitr#   r#   r$   wait  sD    

  
zCondition.waitc                 C   sX   d }|}| }|sT|d urB|d u r.t  | }n|t   }|dkrBqT| | | }q|S r+   )_timerg   )r1   	predicaterE   endtimewaittimeresultr#   r#   r$   wait_forH  s    

zCondition.wait_forrB   c                 C   sz   |   std| j}|rv|dkrv|d }z|  W n tyH   Y n
0 |d8 }z|| W q tyr   Y q0 qd S )Nz!cannot notify on un-acquired lockr   rB   )rT   rI   rZ   rJ   rb   rc   )r1   nwaitersrd   r#   r#   r$   notify_  s    
zCondition.notifyc                 C   s   |  t| j d S r   )rp   r^   rZ   r0   r#   r#   r$   
notify_all}  s    zCondition.notify_all)N)N)N)rB   )rU   r9   r:   r2   r?   rV   rP   r>   rS   rR   rT   rg   rm   rp   rq   	notifyAllr#   r#   r#   r$   r	      s   
	
0

	r	   c                   @   s6   e Zd ZdddZdddZeZddd	Zd
d ZdS )r   rB   c                 C   s&   |dk rt dtt | _|| _d S )Nr   z$semaphore initial value must be >= 0)rc   r	   r   _cond_valuer1   valuer#   r#   r$   r2     s    zSemaphore.__init__TNc                 C   s   |s|d urt dd}d }| jp | jdkrr|s4q|d urd|d u rPt | }n|t  }|dkrdq| j| q$|  jd8  _d}W d    n1 s0    Y  |S )Nz.can't specify timeout for non-blocking acquireFr   rB   T)rc   rs   rt   rh   rg   )r1   rD   rE   rG   rj   r#   r#   r$   rC     s$    

"zSemaphore.acquirec                 C   s`   |dk rt d| j6 |  j|7  _t|D ]}| j  q.W d    n1 sR0    Y  d S )NrB   n must be one or more)rc   rs   rt   rangerp   r1   rn   ir#   r#   r$   rJ     s    zSemaphore.releasec                 C   s   |    d S r   rK   rL   r#   r#   r$   rP     s    zSemaphore.__exit__)rB   )TN)rB   )rU   r9   r:   r2   rC   rV   rJ   rP   r#   r#   r#   r$   r     s
   

-
r   c                   @   s    e Zd ZdddZdddZdS )	r   rB   c                 C   s   t | | || _d S r   )r   r2   _initial_valueru   r#   r#   r$   r2     s    zBoundedSemaphore.__init__c                 C   sx   |dk rt d| jN | j| | jkr0t d|  j|7  _t|D ]}| j  qFW d    n1 sj0    Y  d S )NrB   rw   z!Semaphore released too many times)rc   rs   rt   r{   rx   rp   ry   r#   r#   r$   rJ     s    
zBoundedSemaphore.releaseN)rB   )rB   )rU   r9   r:   r2   rJ   r#   r#   r#   r$   r     s   
r   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   rs   _flagr0   r#   r#   r$   r2     s    zEvent.__init__c                 C   s   | j   d S r   )rs   r?   r0   r#   r#   r$   r?     s    zEvent._at_fork_reinitc                 C   s   | j S r   )r}   r0   r#   r#   r$   is_set  s    zEvent.is_setc                 C   s:   | j   d| _| j   W d    n1 s,0    Y  d S NT)rs   r}   rq   r0   r#   r#   r$   set  s    z	Event.setc                 C   s0   | j  d| _W d    n1 s"0    Y  d S r|   )rs   r}   r0   r#   r#   r$   r]   )  s    zEvent.clearNc                 C   sD   | j * | j}|s| j |}|W  d    S 1 s60    Y  d S r   )rs   r}   rg   )r1   rE   signaledr#   r#   r$   rg   3  s
    z
Event.wait)N)
rU   r9   r:   r2   r?   r~   isSetr   r]   rg   r#   r#   r#   r$   r     s   
r   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 r+   )r	   r   rs   _action_timeout_parties_stater/   )r1   partiesactionrE   r#   r#   r$   r2   ]  s    	zBarrier.__init__c              
   C   s   |d u r| j }| j |   | j}|  jd7  _zL|d | jkrL|   n
| | |W |  jd8  _|   W  d    S |  jd8  _|   0 W d    n1 s0    Y  d S rA   )r   rs   _enterr/   r   _release_wait_exit)r1   rE   indexr#   r#   r$   rg   m  s$    	

  zBarrier.waitc                 C   s(   | j dv r| j  q | j dk r$td S )Nr@   rB   r   )r   rs   rg   r   r0   r#   r#   r$   r     s
    

zBarrier._enterc                 C   s>   z"| j r|    d| _| j  W n   |    Y n0 d S rA   )r   r   rs   rq   _breakr0   r#   r#   r$   r     s    zBarrier._releasec                    s4    j  fdd|s"   t jdk r0td S )Nc                      s
    j dkS r+   r   r#   r0   r#   r$   <lambda>      zBarrier._wait.<locals>.<lambda>r   )rs   rm   r   r   r   r1   rE   r#   r0   r$   r     s    
zBarrier._waitc                 C   s(   | j dkr$| jdv r$d| _| j  d S )Nr   r   )r/   r   rs   rq   r0   r#   r#   r$   r     s    

zBarrier._exitc                 C   sh   | j N | jdkr6| jdkr$d| _q<| jdkr<d| _nd| _| j   W d    n1 sZ0    Y  d S )Nr   r@   )rs   r/   r   rq   r0   r#   r#   r$   reset  s    


zBarrier.resetc                 C   s2   | j  |   W d    n1 s$0    Y  d S r   )rs   r   r0   r#   r#   r$   abort  s    zBarrier.abortc                 C   s   d| _ | j  d S Nr   )r   rs   rq   r0   r#   r#   r$   r     s    zBarrier._breakc                 C   s   | j S r   )r   r0   r#   r#   r$   r     s    zBarrier.partiesc                 C   s   | j dkr| jS dS r+   )r   r/   r0   r#   r#   r$   	n_waiting  s    
zBarrier.n_waitingc                 C   s
   | j dkS r   r   r0   r#   r#   r$   broken  s    zBarrier.broken)NN)N)rU   r9   r:   r2   rg   r   r   r   r   r   r   r   propertyr   r   r   r#   r#   r#   r$   r   T  s   	




r   c                   @   s   e Zd ZdS )r   N)rU   r9   r:   r#   r#   r#   r$   r     s   r   	Thread-%dc                 C   s
   | t   S r   )_counter)templater#   r#   r$   _newname  s    r   c                  C   s   dd t D } t |  d S )Nc                 S   s   g | ]}|  s|qS r#   )r3   ).0r\   r#   r#   r$   
<listcomp>  r   z,_maintain_shutdown_locks.<locals>.<listcomp>)_shutdown_locksdifference_update)	to_remover#   r#   r$   _maintain_shutdown_locks  s    
r   c                   @   s  e Zd ZdZd7ddddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
erXdd Zdd Zdd Zdd Zdd Zd8ddZd9d!d"Zed#d$ Zejd%d$ Zed&d' Zered(d) Zd*d+ Zed,d- Zejd.d- Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdS ):r   FNr#   daemonc                C   s   |d u ri }|| _ t|pt | _|| _|| _|d ur>|| _n
t j| _d | _	t
rXd | _d | _t | _d| _d| _tj| _t | _t|  d S r`   )_targetstrr   _name_args_kwargs	_daemonicr
   r   _ident_HAVE_THREAD_NATIVE_ID
_native_id_tstate_lockr   _started_is_stopped_initialized_sysstderr_stderr_make_invoke_excepthook_invoke_excepthook	_danglingadd)r1   grouptargetr6   r(   r)   r   r#   r#   r$   r2   "  s&    
zThread.__init__c                 C   s>   | j   |r.| jd ur:| j  | j  nd| _d | _d S r   )r   r?   r   rC   r   )r1   is_aliver#   r#   r$   _reset_internal_locksQ  s    


zThread._reset_internal_locksc                 C   s^   d}| j  rd}|   | jr$d}| jr2|d7 }| jd urJ|d| j 7 }d| jj| j|f S )Ninitialstartedstoppedz daemonz %sz<%s(%s, %s)>)	r   r~   r   r   r   r   r8   rU   r   )r1   statusr#   r#   r$   r>   b  s    

zThread.__repr__c                 C   s   | j std| j r tdt | t| < W d    n1 sB0    Y  zt| jd W n> ty   t t| = W d    n1 s0    Y   Y n0 | j	  d S )Nzthread.__init__() not calledz threads can only be started oncer#   )
r   rI   r   r~   _active_limbo_lock_limbo_start_new_thread
_bootstrap	Exceptionrg   r0   r#   r#   r$   startp  s    

&$zThread.startc                 C   s>   z*| j r| j | ji | j W | ` | `| `n| ` | `| `0 d S r   )r   r   r   r0   r#   r#   r$   run  s    	z
Thread.runc                 C   s4   z|    W n"   | jr(td u r(Y d S  Y n0 d S r   )_bootstrap_innerr   r   r0   r#   r#   r$   r     s    zThread._bootstrapc                 C   s   t  | _d S r   )r   r   r0   r#   r#   r$   
_set_ident  s    zThread._set_identc                 C   s   t  | _d S r   )r   r   r0   r#   r#   r$   _set_native_id  s    zThread._set_native_idc                 C   sR   t  | _| j  | jsNt" t  t| j W d    n1 sD0    Y  d S r   )_set_sentinelr   rC   r   _shutdown_locks_lockr   r   r   r0   r#   r#   r$   _set_tstate_lock  s    
zThread._set_tstate_lockc                 C   s$  z|    |   tr|   | j  t  | t| j< t	| = W d    n1 sR0    Y  t
rjtt
 trxtt z|   W n   | |  Y n0 W t* ztt = W n   Y n0 W d    n1 s0    Y  nBt* ztt = W n   Y n0 W d    n1 s0    Y  0 d S r   )r   r   r   r   r   r   r   r5   r   r   r%   r   r   r    r   r   r   r   r0   r#   r#   r$   r     s6    

$

&zThread._bootstrap_innerc                 C   sN   | j }|d urd| _d | _ | jsJt t  W d    n1 s@0    Y  d S r   )r   r   r   r   r   r[   r#   r#   r$   _stop  s    zThread._stopc                 C   s0   t  tt = W d    n1 s"0    Y  d S r   )r   r5   r   r0   r#   r#   r$   _delete  s    zThread._deletec                 C   sZ   | j std| j s td| t u r2td|d u rD|   n| jt|dd d S )NThread.__init__() not calledz'cannot join thread before it is startedzcannot join current threadr   )rE   )r   rI   r   r~   r
   _wait_for_tstate_lockmaxr   r#   r#   r$   join  s    


zThread.joinTr@   c                 C   s^   | j }|d u rd S z |||r0|  |   W n&   | rR|  |    Y n0 d S r   )r   rC   rJ   r   r3   )r1   blockrE   r\   r#   r#   r$   r   *  s    zThread._wait_for_tstate_lockc                 C   s   | j S r   )r   r0   r#   r#   r$   r6   E  s    	zThread.namec                 C   s   t || _d S r   )r   r   r1   r6   r#   r#   r$   r6   P  s    c                 C   s   | j S r   )r   r0   r#   r#   r$   identU  s    
zThread.identc                 C   s   | j S r   )r   r0   r#   r#   r$   	native_idb  s    	zThread.native_idc                 C   s&   | j s| j sdS | d | j  S r|   )r   r   r~   r   r0   r#   r#   r$   r   m  s    	
zThread.is_alivec                 C   s   | j S r   )r   r0   r#   r#   r$   r   {  s    zThread.daemonc                 C   s*   | j std| j r td|| _d S )Nr   z)cannot set daemon status of active thread)r   rI   r   r~   r   r1   daemonicr#   r#   r$   r     s
    
c                 C   s   | j S r   r   r0   r#   r#   r$   isDaemon  s    zThread.isDaemonc                 C   s
   || _ d S r   r   r   r#   r#   r$   	setDaemon  s    zThread.setDaemonc                 C   s   | j S r   r6   r0   r#   r#   r$   getName  s    zThread.getNamec                 C   s
   || _ d S r   r   r   r#   r#   r$   setName  s    zThread.setName)NNNr#   N)N)Tr@   )rU   r9   r:   r   r2   r   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   setterr   r   r   r   r   r   r   r   r#   r#   r#   r$   r     sL   	  /	
&








r   )_excepthook_ExceptHookArgs)print_exception)
namedtupler   z'exc_type exc_value exc_traceback threadc                 C   s   t |  S r   )r   )r(   r#   r#   r$   r     s    c                C   s   | j tkrd S td ur(tjd ur(tj}n$| jd urH| jj}|d u rLd S nd S | jd ur`| jj}nt }td| d|dd t	| j | j
| j|d |  d S )NzException in thread :Tfileflush)r   )exc_type
SystemExitr   r   threadr   r6   r   print_print_exception	exc_valueexc_tracebackr   )r(   r   r6   r#   r#   r$   r     s&    



r   c                     sP   t tj d u rtdd u r*tdtjt t fdd} | S )Nzthreading.excepthook is Nonezsys.excepthook is Nonec              
      s   zz.t }|d u r}tg  | }|| W n ty } zjd|_~d urbjd urbj}n| j} d|dd d urj d urj }n}|   W Y d }~n
d }~0 0 W d }nd }0 d S )NTz"Exception in threading.excepthook:r   )r   r   r   __suppress_context__r   r   )r   hookr(   excr   sys_excepthooklocal_print	local_sysold_excepthookold_sys_excepthooksys_exc_infor#   r$   invoke_excepthook  s(    "z2_make_invoke_excepthook.<locals>.invoke_excepthook)r   r   rI   exc_infor   )r   r#   r   r$   r     s     r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	r   Nc                 C   sF   t |  || _|| _|d ur"|ng | _|d ur4|ni | _t | _d S r   )r   r2   intervalfunctionr(   r)   r   finished)r1   r   r   r(   r)   r#   r#   r$   r2     s    
zTimer.__init__c                 C   s   | j   d S r   )r   r   r0   r#   r#   r$   cancel  s    zTimer.cancelc                 C   s:   | j | j | j  s,| j| ji | j | j   d S r   )r   rg   r   r~   r   r(   r)   r   r0   r#   r#   r$   r     s    
z	Timer.run)NN)rU   r9   r:   r2   r   r   r#   r#   r#   r$   r     s   	
r   c                   @   s   e Zd Zdd ZdS )_MainThreadc                 C   sh   t j| ddd |   | j  |   tr6|   t | t	| j
< W d    n1 sZ0    Y  d S )N
MainThreadFr6   r   )r   r2   r   r   r   r   r   r   r   r5   r   r0   r#   r#   r$   r2   "  s    
z_MainThread.__init__N)rU   r9   r:   r2   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r2|   t | t	| j
< W d    n1 sV0    Y  d S )NzDummy-%dTr  )r   r2   r   r   r   r   r   r   r   r5   r   r0   r#   r#   r$   r2   7  s    
z_DummyThread.__init__c                 C   s   d S r   r#   r0   r#   r#   r$   r   A  s    z_DummyThread._stopc                 C   s   dS r   r#   r0   r#   r#   r$   r   D  s    z_DummyThread.is_aliveNc                 C   s   d S r   r#   r   r#   r#   r$   r   H  s    z_DummyThread.join)N)rU   r9   r:   r2   r   r   r   r#   r#   r#   r$   r  5  s   
r  c                   C   s*   zt t  W S  ty$   t  Y S 0 d S r   )r5   r   r7   r  r#   r#   r#   r$   r
   N  s    r
   c                   C   s8   t   tttt W  d    S 1 s*0    Y  d S r   )r   r^   r5   r   r#   r#   r#   r$   r   \  s    r   c                   C   s   t t t t  S r   )listr5   valuesr   r#   r#   r#   r$   
_enumerateh  s    r  c                   C   s@   t ( tt tt  W  d    S 1 s20    Y  d S r   )r   r  r5   r  r   r#   r#   r#   r$   r   l  s    r   c                 O   s2   t rtdtj| g|R i |}t| d S )Nz$can't register atexit after shutdown)_SHUTTING_DOWNrI   	functoolspartial_threading_atexitsra   )r"   argr)   callr#   r#   r$   _register_atexit{  s    
r  )r   c                  C   s   t jr
d S dattD ]
} |   qt jt krFt j}|  t 	  n t
  tt}t  W d    n1 sp0    Y  |sq|D ]}|  |  qqFd S r   )_main_threadr   r  reversedr  r   r   r   rJ   r   r   r  r   r]   rC   )atexit_calltlocklocksr\   r#   r#   r$   	_shutdown  s"    	
&r  c                   C   s   t S r   )r  r#   r#   r#   r$   r     s    r   )_local)r   c                  C   s   t  ai } ztt  }W n ty0   t }Y n0 |at at	 a
t t	t }|t |D ]>}||u r|d t }||_|| |< q`|d |  q`t  t  t|  W d    n1 s0    Y  d S )NTF)r   r   r5   r   r7   r  r  r,   r   r   r   r  updater   r   r   r   r   r]   )
new_activecurrentthreadsr   r   r#   r#   r$   _after_fork  s0    






r  register_at_fork)after_in_child)r   )^os_ossysr   _threadr	  timer   rh   _weakrefsetr   	itertoolsr   _islicer   r/   _collectionsr   rY   ImportErrorcollections__all__start_new_threadr   allocate_lockr,   r   r   r   r   ra   rX   errorr   r   r&   r   r    r%   r   r   r   r*   r'   r	   r   r   r   r   rI   r   __next__r   r   r   r5   r   r   r   r   r   r   r   r   r   r   r   	tracebackr   r   r   r   r   r  r  r
   currentThreadr   activeCountr  r   r  r  r  r   r  r  r   r  r   Z_threading_localr  hasattrr  r#   r#   r#   r$   <module>   s   



v 2S)O 
   5
85