o
     JAfp                     @   s4  	 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y<   d dlmZ Y nw 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yd   d	ZY nw ej Z!zej"Z#W n eyx   dZ#Y nw ej$Z$[da%da&d
d Z'dd Z(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/Z0G dd dZ1G dd dZ2G d d! d!e3Z4ed"j5Z6d#d$ Z7e" a8i Z9i Z:e
 Z;e a<e= a>d%d& Z?G d'd( d(Z@z
d d)lmAaBmCZD W n# ey   d d*lEmFZG d d+lmHZH eHd,d-ZCd.d, ZDd/d0 aBY nw tBZId1d2 ZJG d3d4 d4e@ZKG d5d6 d6e@ZLG d7d8 d8e@ZMd9d: ZNd;d< ZOd=d> ZPd?d@ ZQdAdB ZRdCdD ZSg ZTd	aUdEdF ZVd dGlmWZW eL aXdHdI ZYdJdK ZZzd dLlm[Z\ W n ey   d dMl]m\Z\ Y nw dNdO Z^e_edPrej`e^dQ dS dS )R    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ExceptHookArgsgettrace
getprofileTget_native_idFc                 C   
   	 | a d S N_profile_hookfunc r'    /usr/lib/python3.10/threading.pyr   :      r   c                   C      	 t S r"   r#   r'   r'   r'   r(   r   D      r   c                 C   r!   r"   _trace_hookr%   r'   r'   r(   r   H   r)   r   c                   C   r*   r"   r,   r'   r'   r'   r(   r   R   r+   r   c                  O   s&   	 t d u rt| i |S t | i |S r"   )_CRLock_PyRLock)argskwargsr'   r'   r(   r   Z   s   r   c                   @   s\   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__q   s   
z_RLock.__init__c              	   C   s\   | j }zt| j}W n	 ty   Y nw 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>lockedunlocked)r6   _activenameKeyErrorr5   r;   	__class__
__module____qualname__r7   hexid)r9   ownerr'   r'   r(   __repr__v   s   
z_RLock.__repr__c                 C   s   | j   d | _d| _d S r3   )r5   _at_fork_reinitr6   r7   r8   r'   r'   r(   rG      s   

z_RLock._at_fork_reinitTc                 C   sF   	 t  }| j|kr|  jd7  _dS | j||}|r!|| _d| _|S N   )r   r6   r7   r5   acquire)r9   blockingtimeoutmercr'   r'   r(   rK      s   
z_RLock.acquirec                 C   sB   	 | j t krtd| jd  | _}|sd | _ | j  d S d S )Ncannot release un-acquired lockrJ   )r6   r   RuntimeErrorr7   r5   release)r9   r   r'   r'   r(   rR      s   z_RLock.releasec                 C      |    d S r"   rR   r9   tvtbr'   r'   r(   __exit__      z_RLock.__exit__c                 C   s   | j   |\| _| _d S r"   )r5   rK   r7   r6   )r9   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   rP   )r7   rQ   r6   r5   rR   )r9   r   rE   r'   r'   r(   _release_save   s   

z_RLock._release_savec                 C   s   | j t kS r"   )r6   r   r8   r'   r'   r(   	_is_owned   rZ   z_RLock._is_ownedNTrH   )__name__rA   rB   r:   rF   rG   rK   	__enter__rR   rY   r\   r]   r^   r'   r'   r'   r(   r2   g   s    	
$
r2   c                   @   s~   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dd ZdS )r	   Nc                 C   s   |d u rt  }|| _|j| _|j| _z|j| _W n	 ty!   Y nw z|j| _W n	 ty1   Y nw z|j| _W n	 tyA   Y nw t | _	d S r"   )
r   _lockrK   rR   r]   AttributeErrorr\   r^   _deque_waitersr9   lockr'   r'   r(   r:      s*   zCondition.__init__c                 C   s   | j   | j  d S r"   )rb   rG   re   clearr8   r'   r'   r(   rG     s   
zCondition._at_fork_reinitc                 C   s
   | j  S r"   )rb   ra   r8   r'   r'   r(   ra        
zCondition.__enter__c                 G   s   | j j| S r"   )rb   rY   )r9   r0   r'   r'   r(   rY     rZ   zCondition.__exit__c                 C   s   d| j t| jf S )Nz<Condition(%s, %d)>)rb   lenre   r8   r'   r'   r(   rF     s   zCondition.__repr__c                 C      | j   d S r"   )rb   rR   r8   r'   r'   r(   r]        zCondition._release_savec                 C   rk   r"   )rb   rK   )r9   xr'   r'   r(   r\     rl   zCondition._acquire_restorec                 C   s   | j dr| j   dS dS )NFT)rb   rK   rR   r8   r'   r'   r(   r^     s   
zCondition._is_ownedc                 C   s   	 |   s	tdt }|  | j| |  }d}z7|d u r(|  d}n|dkr3|d|}n|d}|W | | |sSz| j| W S  t	yR   Y S w S | | |smz| j| W w  t	yl   Y w w w )Nzcannot wait on un-acquired lockFTr   )
r^   rQ   r4   rK   re   appendr]   r\   remove
ValueError)r9   rM   waitersaved_stategotitr'   r'   r(   wait   s@   


zCondition.waitc                 C   s`   	 d }|}| }|s.|d ur$|d u rt  | }n|t   }|dkr$	 |S | | | }|r
|S r3   )_timert   )r9   	predicaterM   endtimewaittimeresultr'   r'   r(   wait_forP  s    


zCondition.wait_forrJ   c                 C   s   	 |   s	td| j}|rC|dkrE|d }z|  W n	 ty%   Y nw |d8 }z|| W n	 ty:   Y nw |rG|dksd S d S d S d S )Nz!cannot notify on un-acquired lockr   rJ   )r^   rQ   re   rR   ro   rp   )r9   nwaitersrq   r'   r'   r(   notifyg  s$   	zCondition.notifyc                 C   s   	 |  t| j d S r"   )r}   rj   re   r8   r'   r'   r(   
notify_all  s   zCondition.notify_allc                 C   s&   	 dd l }|jdtdd |   d S )Nr   z3notifyAll() is deprecated, use notify_all() instead   
stacklevel)warningswarnDeprecationWarningr~   r9   r   r'   r'   r(   	notifyAll  s   zCondition.notifyAllr"   rJ   )r`   rA   rB   r:   rG   ra   rY   rF   r]   r\   r^   rt   rz   r}   r~   r   r'   r'   r'   r(   r	      s    

	
0
	r	   c                   @   s8   e Zd Z	 dddZdddZeZddd	Zd
d ZdS )r   rJ   c                 C   s&   |dk rt dtt | _|| _d S )Nr   z$semaphore initial value must be >= 0)rp   r	   r   _cond_valuer9   valuer'   r'   r(   r:     s   
zSemaphore.__init__TNc                 C   s   	 |s|d urt dd}d }| jM | jdkr>|sn4|d ur3|d u r)t | }n
|t  }|dkr3n$| j| | jdks|  jd8  _d}W d    |S W d    |S W d    |S 1 sbw   Y  |S )Nz.can't specify timeout for non-blocking acquireFr   rJ   T)rp   r   r   ru   rt   )r9   rL   rM   rO   rw   r'   r'   r(   rK     s:   





zSemaphore.acquirec                 C   sd   	 |dk r	t d| j |  j|7  _t|D ]}| j  qW d    d S 1 s+w   Y  d S )NrJ   n must be one or more)rp   r   r   ranger}   r9   r{   ir'   r'   r(   rR     s   "zSemaphore.releasec                 C   rS   r"   rT   rU   r'   r'   r(   rY     rZ   zSemaphore.__exit__r   )TN)r`   rA   rB   r:   rK   ra   rR   rY   r'   r'   r'   r(   r     s    

-
r   c                   @   s"   e Zd Z	 dddZdddZdS )r   rJ   c                 C   s   t | | || _d S r"   )r   r:   _initial_valuer   r'   r'   r(   r:        
zBoundedSemaphore.__init__c                 C   s|   	 |dk r	t d| j( | j| | jkrt d|  j|7  _t|D ]}| j  q$W d    d S 1 s7w   Y  d S )NrJ   r   z!Semaphore released too many times)rp   r   r   r   r   r}   r   r'   r'   r(   rR     s   	"zBoundedSemaphore.releaseNr   )r`   rA   rB   r:   rR   r'   r'   r'   r(   r     s    
r   c                   @   sH   e Z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S )r   c                 C   s   t t | _d| _d S NF)r	   r   r   _flagr8   r'   r'   r(   r:   !  r   zEvent.__init__c                 C   rk   r"   )r   rG   r8   r'   r'   r(   rG   %  s   zEvent._at_fork_reinitc                 C      	 | j S r"   )r   r8   r'   r'   r(   is_set)  s   zEvent.is_setc                 C   s"   	 dd l }|jdtdd |  S )Nr   z+isSet() is deprecated, use is_set() insteadr   r   )r   r   r   r   r   r'   r'   r(   isSet-  s   zEvent.isSetc                 C   s>   	 | j  d| _| j   W d    d S 1 sw   Y  d S NT)r   r   r~   r8   r'   r'   r(   set8  s
   "z	Event.setc                 C   s4   	 | j  d| _W d    d S 1 sw   Y  d S r   )r   r   r8   r'   r'   r(   rh   C  s   "zEvent.clearNc                 C   sF   	 | j  | j}|s| j |}|W  d    S 1 sw   Y  d S r"   )r   r   rt   )r9   rM   signaledr'   r'   r(   rt   M  s   $z
Event.waitr"   )
r`   rA   rB   r:   rG   r   r   r   rh   rt   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   s0   	 t t | _|| _|| _|| _d| _d| _d S r3   )r	   r   r   _action_timeout_parties_stater7   )r9   partiesactionrM   r'   r'   r(   r:   w  s   
zBarrier.__init__c              
   C   s   	 |d u r| j }| jB |   | j}|  jd7  _z&|d | jkr'|   n| | |W |  jd8  _|   W  d    S |  jd8  _|   w 1 sPw   Y  d S rI   )r   r   _enterr7   r   _release_wait_exit)r9   rM   indexr'   r'   r(   rt     s$   


zBarrier.waitc                 C   s0   | j dv r| j  | j dv s| j dk rtd S )NrH   rJ   r   )r   r   rt   r   r8   r'   r'   r(   r     s   



zBarrier._enterc                 C   s6   z| j r|    d| _| j  W d S    |    rI   )r   r   r   r~   _breakr8   r'   r'   r(   r     s   zBarrier._releasec                    s4    j  fdd|s   t jdk rtd S )Nc                      s
    j dkS r3   r   r'   r8   r'   r(   <lambda>  s   
 zBarrier._wait.<locals>.<lambda>r   )r   rz   r   r   r   r9   rM   r'   r8   r(   r     s   
zBarrier._waitc                 C   s0   | j dkr| jdv rd| _| j  d S d S d S )Nr   r   )r7   r   r   r~   r8   r'   r'   r(   r     s   

zBarrier._exitc                 C   sl   	 | j ( | jdkr| jdkrd| _n| jdkrd| _nd| _| j   W d    d S 1 s/w   Y  d S )Nr   rH   )r   r7   r   r~   r8   r'   r'   r(   reset  s   


"zBarrier.resetc                 C   s6   	 | j  |   W d    d S 1 sw   Y  d S r"   )r   r   r8   r'   r'   r(   abort  s   
"zBarrier.abortc                 C   s   d| _ | j  d S Nr   )r   r   r~   r8   r'   r'   r(   r     s   zBarrier._breakc                 C   r   r"   )r   r8   r'   r'   r(   r     s   zBarrier.partiesc                 C   s   	 | j dkr	| jS dS r3   )r   r7   r8   r'   r'   r(   	n_waiting  s   
zBarrier.n_waitingc                 C   s   	 | j dkS r   r   r8   r'   r'   r(   broken  s   
zBarrier.brokenNNr"   )r`   rA   rB   r:   rt   r   r   r   r   r   r   r   propertyr   r   r   r'   r'   r'   r(   r   n  s"    




r   c                   @   s   e Zd ZdS )r   N)r`   rA   rB   r'   r'   r'   r(   r     s    r   rJ   c                 C   s
   | t   S r"   )_counter)name_templater'   r'   r(   _newname  ri   r   c                  C   s   	 dd t D } t |  d S )Nc                 S   s   g | ]}|  s|qS r'   )r;   ).0rg   r'   r'   r(   
<listcomp>*  s    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r/d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rde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 }|rt |}ntd}|d ur-z|j}|d| d7 }W n	 ty,   Y nw || _|| _|| _|| _|d urA|| _nt	 j
| _d | _trNd | _d | _t | _d| _d| _tj| _t | _t|  d S )Nz	Thread-%dz ()FT)strr   r`   rc   _target_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)r9   grouptargetr>   r0   r1   r   target_namer'   r'   r(   r:   ;  s<   

zThread.__init__c                 C   sD   | j   |r| jd ur| j  | j  d S d S d| _d | _d S r   )r   rG   r   rK   r   )r9   is_aliver'   r'   r(   _reset_internal_locksu  s   



zThread._reset_internal_locksc                 C   s^   d}| j  r	d}|   | jrd}| jr|d7 }| jd ur%|d| j 7 }d| jj| j|f S )Ninitialstartedstoppedz daemonz %sz<%s(%s, %s)>)	r   r   r   r   r   r   r@   r`   r   )r9   statusr'   r'   r(   rF     s   

zThread.__repr__c                 C   s   	 | j std| j rtdt | t| < W d    n1 s"w   Y  zt| jd W n tyL   t t| = W d     1 sFw   Y   w | j	  d S )Nzthread.__init__() not calledz threads can only be started oncer'   )
r   rQ   r   r   _active_limbo_lock_limbo_start_new_thread
_bootstrap	Exceptionrt   r8   r'   r'   r(   start  s&   	


zThread.startc                 C   sT   	 z!| j d ur| j | ji | j W | ` | `| `d S W | ` | `| `d S | ` | `| `w r"   )r   r   r   r8   r'   r'   r(   run  s   
z
Thread.runc                 C   s,   z|    W d S    | jrtd u rY d S  r"   )_bootstrap_innerr   r   r8   r'   r'   r(   r     s   zThread._bootstrapc                 C      t  | _d S r"   )r   r   r8   r'   r'   r(   
_set_ident  rZ   zThread._set_identc                 C   r   r"   )r    r   r8   r'   r'   r(   _set_native_id  rZ   zThread._set_native_idc                 C   sZ   	 t  | _| j  | js+t t  t| j W d    d S 1 s$w   Y  d S d S r"   )_set_sentinelr   rK   r   _shutdown_locks_lockr   r   r   r8   r'   r'   r(   _set_tstate_lock  s   
"zThread._set_tstate_lockc                 C   s4  zt|    |   tr|   | j  t | t| j< t	| = W d    n1 s)w   Y  t
r5tt
 tr<tt z|   W n	   | |  Y W t ztt = W n   Y W d    d S W d    d S 1 snw   Y  d S t ztt = W n   Y W d    w W d    w 1 sw   Y  w r"   )r   r   r   r   r   r   r   r=   r   r   r-   r   r   r$   r   r   r   r   r8   r'   r'   r(   r     sD   



(zThread._bootstrap_innerc                 C   sT   | j }|d urd| _d | _ | js(t t  W d    d S 1 s!w   Y  d S d S r   )r   r   r   r   r   rf   r'   r'   r(   _stop  s   "zThread._stopc                 C   s4   	 t  tt = W d    d S 1 sw   Y  d S r"   )r   r=   r   r8   r'   r'   r(   _delete  s   
"zThread._deletec                 C   s^   	 | j std| j std| t u rtd|d u r$|   d S | jt|dd d S )NThread.__init__() not calledz'cannot join thread before it is startedzcannot join current threadr   )rM   )r   rQ   r   r   r
   _wait_for_tstate_lockmaxr   r'   r'   r(   join(  s   

zThread.joinTrH   c                 C   s\   | j }|d u r	d S z|||r|  |   W d S W d S    | r-|  |    r"   )r   rK   rR   r   r;   )r9   blockrM   rg   r'   r'   r(   r   N  s   zThread._wait_for_tstate_lockc                 C   r   r"   )r   r8   r'   r'   r(   r>   i     zThread.namec                 C   s   t || _d S r"   )r   r   )r9   r>   r'   r'   r(   r>   t  s   c                 C   r   r"   )r   r8   r'   r'   r(   identy  s   zThread.identc                 C   r   r"   )r   r8   r'   r'   r(   	native_id  r   zThread.native_idc                 C   s(   	 | j s	| j sdS | d | j  S r   )r   r   r   r   r8   r'   r'   r(   r     s
   
zThread.is_alivec                 C   r   r"   )r   r8   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   rQ   r   r   r   )r9   daemonicr'   r'   r(   r     s
   

c                 C       	 dd l }|jdtdd | jS )Nr   z:isDaemon() is deprecated, get the daemon attribute insteadr   r   r   r   r   r   r   r'   r'   r(   isDaemon     zThread.isDaemonc                 C   $   	 dd l }|jdtdd || _d S )Nr   z;setDaemon() is deprecated, set the daemon attribute insteadr   r   r   )r9   r   r   r'   r'   r(   	setDaemon     
zThread.setDaemonc                 C   r   )Nr   z7getName() is deprecated, get the name attribute insteadr   r   r   r   r   r>   r   r'   r'   r(   getName  r   zThread.getNamec                 C   r   )Nr   z7setName() is deprecated, set the name attribute insteadr   r   r   )r9   r>   r   r'   r'   r(   setName  r   zThread.setName)NNNr'   Nr"   r_   )r`   rA   rB   r   r:   r   rF   r   r   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   0  sP    :
	
&







r   )_excepthook_ExceptHookArgs)print_exception)
namedtupler   z'exc_type exc_value exc_traceback threadc                 C   s   t |  S r"   )r   )r0   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r%| jj}|d u r$d S nd S | jd ur1| 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   r>   r   print_print_exception	exc_valueexc_tracebackr  )r0   r   r>   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   zczt }|d u r
}tg  | }|| W nA tyY } z5d|_~d ur1jd ur1j}n| j} d|dd d urHj d urHj }n}|   W Y d }~n
d }~ww W d }d S W d }d S d }w )NTz"Exception in threading.excepthook:r  )r   r   r   __suppress_context__r   r   )r  hookr0   excr   sys_excepthooklocal_print	local_sysold_excepthookold_sys_excepthooksys_exc_infor'   r(   invoke_excepthook%  s2   z2_make_invoke_excepthook.<locals>.invoke_excepthook)r   r   rQ   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r|ni | _t | _d S r"   )r   r:   intervalfunctionr0   r1   r   finished)r9   r  r  r0   r1   r'   r'   r(   r:   S  s   
zTimer.__init__c                 C   s   	 | j   d S r"   )r  r   r8   r'   r'   r(   cancel[  s   zTimer.cancelc                 C   s:   | j | j | j  s| j| ji | j | j   d S r"   )r  rt   r  r   r  r0   r1   r   r8   r'   r'   r(   r   _  s   
z	Timer.runr   )r`   rA   rB   r:   r  r   r'   r'   r'   r(   r   J  s
    
r   c                   @   s   e Zd Zdd ZdS )_MainThreadc                 C   sj   t j| ddd |   | j  |   tr|   t | t	| j
< W d    d S 1 s.w   Y  d S )N
MainThreadFr>   r   )r   r:   r   r   r   r   r   r   r   r=   r   r8   r'   r'   r(   r:   j  s   
"z_MainThread.__init__N)r`   rA   rB   r:   r'   r'   r'   r(   r  h  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   sf   t j| tddd | j  |   tr|   t | t	| j
< W d    d S 1 s,w   Y  d S )NzDummy-%dTr  )r   r:   r   r   r   r   r   r   r   r=   r   r8   r'   r'   r(   r:     s   
"z_DummyThread.__init__c                 C      d S r"   r'   r8   r'   r'   r(   r     s   z_DummyThread._stopc                 C   s   dS r   r'   r8   r'   r'   r(   r     s   z_DummyThread.is_aliveNc                 C   r!  r"   r'   r   r'   r'   r(   r     s    z_DummyThread.joinr"   )r`   rA   rB   r:   r   r   r   r'   r'   r'   r(   r   }  s
    
r   c                   C   s(   	 zt t  W S  ty   t  Y S w r"   )r=   r   r?   r   r'   r'   r'   r(   r
     s   
r
   c                  C       	 dd l } | jdtdd t S )Nr   z;currentThread() is deprecated, use current_thread() insteadr   r   )r   r   r   r
   r   r'   r'   r(   currentThread  r   r$  c                   C   s:   	 t  tttt W  d    S 1 sw   Y  d S r"   )r   rj   r=   r   r'   r'   r'   r(   r     s   $r   c                  C   r"  )Nr   z7activeCount() is deprecated, use active_count() insteadr   r   )r   r   r   r   r#  r'   r'   r(   activeCount  r   r%  c                   C   s   t t t t  S r"   )listr=   valuesr   r'   r'   r'   r(   
_enumerate  s   r(  c                   C   sB   	 t  tt tt  W  d    S 1 sw   Y  d S r"   )r   r&  r=   r'  r   r'   r'   r'   r(   r     s   $r   c                 O   s4   	 t rtdtj| g|R i |}t| d S )Nz$can't register atexit after shutdown)_SHUTTING_DOWNrQ   	functoolspartial_threading_atexitsrn   )r&   argr1   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r$t j}|  t 	  n	 	 t
 tt}t  W d    n1 s;w   Y  |sDd S |D ]
}|  |  qFq&r   )_main_threadr   r)  reversedr,  r   r   r   rR   r   r   r&  r   rh   rK   )atexit_calltlocklocksrg   r'   r'   r(   	_shutdown  s,   


r5  c                   C   r*   r"   )r0  r'   r'   r'   r(   r   &  s   r   )_local)r   c                  C   s   	 t  ai } ztt  }W n ty   t }Y nw |at at	 a
tB t	t }|t |D ]}||u rG|d t }||_|| |< q1|d |  q1t  t  t|  W d    d S 1 siw   Y  d S )NTF)r   r   r=   r   r?   r  r0  r4   r   r   r   r(  updater   r   r   r   r   rh   )
new_activecurrentthreadsr  r   r'   r'   r(   _after_fork7  s4   






"r;  register_at_fork)after_in_child)aos_ossysr   _threadr*  timer   ru   _weakrefsetr   	itertoolsr   _islicer   r7   _collectionsr   rd   ImportErrorcollections__all__start_new_threadr   allocate_lockr4   r   r   r    r   rn   rc   errorr   r   r.   r   r$   r-   r   r   r   r   r   r2   r/   r	   r   r   r   r   rQ   r   __next__r   r   r   r=   r   r   r   r   r   r   r   r   r   r   r   	tracebackr   r
  r  __excepthook__r   r   r  r   r
   r$  r   r%  r(  r   r,  r)  r/  r   r0  r5  r   r6  r   Z_threading_localr;  hasattrr<  r'   r'   r'   r(   <module>   s    


v ;S)X 
   6,5
85