o
    >cp                     @   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'   ]/Volumes/Data/workspace/med-macos-weekly/build/ExtProjs/pyncpp/python/source/Lib/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>lockedZ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(   rF      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(   rJ      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 lockrI   )r6   r   RuntimeErrorr7   r5   release)r9   r   r'   r'   r(   rQ      s   z_RLock.releasec                 C      |    d S r"   rQ   r9   tvtbr'   r'   r(   __exit__      z_RLock.__exit__c                 C   s   | j   |\| _| _d S r"   )r5   rJ   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   rO   )r7   rP   r6   r5   rQ   )r9   r   rD   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   rY   z_RLock._is_ownedNTrG   )__name__r@   rA   r:   rE   rF   rJ   	__enter__rQ   rX   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   _lockrJ   rQ   r\   AttributeErrorr[   r]   _deque_waitersr9   lockr'   r'   r(   r:      s*   zCondition.__init__c                 C   s   | j   | j  d S r"   )ra   rF   rd   clearr8   r'   r'   r(   rF     s   
zCondition._at_fork_reinitc                 C   s
   | j  S r"   )ra   r`   r8   r'   r'   r(   r`        
zCondition.__enter__c                 G   s   | j j| S r"   )ra   rX   )r9   r0   r'   r'   r(   rX     rY   zCondition.__exit__c                 C   s   d| j t| jf S )Nz<Condition(%s, %d)>)ra   lenrd   r8   r'   r'   r(   rE     s   zCondition.__repr__c                 C      | j   d S r"   )ra   rQ   r8   r'   r'   r(   r\        zCondition._release_savec                 C   rj   r"   )ra   rJ   )r9   xr'   r'   r(   r[     rk   zCondition._acquire_restorec                 C   s   | j dr| j   dS dS )NFT)ra   rJ   rQ   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]   rP   r4   rJ   rd   appendr\   r[   remove
ValueError)r9   rL   waiterZsaved_stateZ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   )_timerq   )r9   Z	predicaterL   endtimeZwaittimeresultr'   r'   r(   wait_forP  s    


zCondition.wait_forrI   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   rI   )r]   rP   rd   rQ   rn   ro   )r9   nwaitersrp   r'   r'   r(   notifyg  s$   	zCondition.notifyc                 C   s   	 |  t| j d S r"   )rx   ri   rd   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DeprecationWarningry   r9   r}   r'   r'   r(   	notifyAll  s   zCondition.notifyAllr"   rI   )r_   r@   rA   r:   rF   r`   rX   rE   r\   r[   r]   rq   ru   rx   ry   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   rI   c                 C   s&   |dk rt dtt | _|| _d S )Nr   z$semaphore initial value must be >= 0)ro   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   rI   T)ro   r   r   rr   rq   )r9   rK   rL   rN   rs   r'   r'   r(   rJ     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 )NrI   n must be one or more)ro   r   r   rangerx   r9   rv   ir'   r'   r(   rQ     s   "zSemaphore.releasec                 C   rR   r"   rS   rT   r'   r'   r(   rX     rY   zSemaphore.__exit__r   )TN)r_   r@   rA   r:   rJ   r`   rQ   rX   r'   r'   r'   r(   r     s    

-
r   c                   @   s"   e Zd Z	 dddZdddZdS )r   rI   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 )NrI   r   z!Semaphore released too many times)ro   r   r   r   r   rx   r   r'   r'   r(   rQ     s   	"zBoundedSemaphore.releaseNr   )r_   r@   rA   r:   rQ   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   rj   r"   )r   rF   r8   r'   r'   r(   rF   %  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() insteadrz   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   ry   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(   rg   C  s   "zEvent.clearNc                 C   sF   	 | j  | j}|s| j |}|W  d    S 1 sw   Y  d S r"   )r   r   rq   )r9   rL   Zsignaledr'   r'   r(   rq   M  s   $z
Event.waitr"   )
r_   r@   rA   r:   rF   r   r   r   rg   rq   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actionrL   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 rH   )r   r   _enterr7   r   _release_wait_exit)r9   rL   indexr'   r'   r(   rq     s$   


zBarrier.waitc                 C   s0   | j dv r| j  | j dv s| j dk rtd S )NrG   rI   r   )r   r   rq   r   r8   r'   r'   r(   r     s   



zBarrier._enterc                 C   s6   z| j r|    d| _| j  W d S    |    rH   )r   r   r   ry   _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   ru   r   r   r   r9   rL   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   ry   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   rG   )r   r7   r   ry   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   ry   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_   r@   rA   r:   rq   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_   r@   rA   r'   r'   r'   r(   r     s    r   rI   c                 C   s
   | t   S r"   )_counter)Zname_templater'   r'   r(   _newname  rh   r   c                  C   s   	 dd t D } t |  d S )Nc                 S   s   g | ]}|  s|qS r'   )r;   ).0rf   r'   r'   r(   
<listcomp>*  s    z,_maintain_shutdown_locks.<locals>.<listcomp>)_shutdown_locksdifference_update)Z	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_   rb   _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   Z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   rF   r   rJ   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 )NZinitialZstartedZstoppedz daemonz %sz<%s(%s, %s)>)	r   r   r   r   r   r   r?   r_   r   )r9   Zstatusr'   r'   r(   rE     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   rP   r   r   _active_limbo_lock_limbo_start_new_thread
_bootstrap	Exceptionrq   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  rY   zThread._set_identc                 C   r   r"   )r    r   r8   r'   r'   r(   _set_native_id  rY   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   rJ   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   re   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   )rL   )r   rP   r   r   r
   _wait_for_tstate_lockmaxr   r'   r'   r(   join(  s   

zThread.joinTrG   c                 C   s\   | j }|d u r	d S z|||r|  |   W d S W d S    | r-|  |    r"   )r   rJ   rQ   r   r;   )r9   ZblockrL   rf   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   rP   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 insteadrz   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 insteadrz   r{   r   )r9   r   r}   r'   r'   r(   	setDaemon     
zThread.setDaemonc                 C   r   )Nr   z7getName() is deprecated, get the name attribute insteadrz   r{   r}   r~   r   r=   r   r'   r'   r(   getName  r   zThread.getNamec                 C   r   )Nr   z7setName() is deprecated, set the name attribute insteadrz   r{   r   )r9   r=   r}   r'   r'   r(   setName  r   zThread.setName)NNNr'   Nr"   r^   )r_   r@   rA   r   r:   r   rE   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   Zsys_excepthookZlocal_printZ	local_sysZold_excepthookZold_sys_excepthookZsys_exc_infor'   r(   invoke_excepthook%  s2   z2_make_invoke_excepthook.<locals>.invoke_excepthook)r   r   rP   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  rq   r  r   r  r0   r1   r   r8   r'   r'   r(   r   _  s   
z	Timer.runr   )r_   r@   rA   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 )NZ
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_   r@   rA   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_   r@   rA   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() insteadrz   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   ri   r<   r   r'   r'   r'   r(   r     s   $r   c                  C   r  )Nr   z7activeCount() is deprecated, use active_count() insteadrz   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_DOWNrP   	functoolsZpartial_threading_atexitsrm   )r&   argr1   Z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   rQ   r   r   r  r   rg   rJ   )Zatexit_callZtlockZlocksrf   r'   r'   r(   	_shutdown  s,   


r  c                   C   r*   r"   )r  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	  r  r4   r   r   r   r  updater   r   r   r   r   rg   )Z
new_activeZcurrentZthreadsr   r   r'   r'   r(   _after_fork7  s4   






"r  register_at_fork)Zafter_in_child)aos_ossysr   _threadr  timer   rr   Z_weakrefsetr   Z	itertoolsr   Z_islicer   r7   Z_collectionsr   rc   ImportErrorZcollections__all__start_new_threadr   allocate_lockr4   r   r   r    r   rm   rb   errorr   r   r.   r   r$   r-   r   r   r   r   r   r2   r/   r	   r   r   r   r   rP   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   r  r  r   r  r   Z_threading_localr  hasattrr  r'   r'   r'   r(   <module>   s    


v ;S)X 
   6,5
85