3 �L�j���@s|ddlZddlZddlmZmZddlm Z ddl m Z ddl mZmZyddlmZWn ek rxddlmZYnXddd d d d d ddddddddddddddgZejZejZejZejZejZy ej Z!Wne"k r�dZ!YnXej#Z#[da$da%dd�Z&dd�Z'eZ(dd�Z Gdd �d �Z)e)Z*Gd!d �d �Z+Gd"d�d�Z,Gd#d�de,�Z-Gd$d�d�Z.Gd%d�d�Z/Gd&d�de0�Z1e�j2Z3e3�d?d(d)�Z4e �a5iZ6iZ7e �Z8Gd*d�d�Z9Gd+d�de9�Z:Gd,d-�d-e9�Z;Gd.d/�d/e9�Zd1d�Z?e?Z@d2d3�ZAd4d �ZBdd5lmCZCe;�aDd6d7�ZEd8d9�ZFd:d �ZGydd;lmHZIWn"ek �rndd�ZKdS)@�N)� monotonic�sleep)� 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_sizecCs|adS)N)� _profile_hook)�func�r �!/usr/lib64/python3.6/threading.pyr2scCs|adS)N)� _trace_hook)rr r r!r<scOstdkrt||�St||�S)N)�_CRLock�_PyRLock)�args�kwargsr r r!rJs  c@sReZdZdd�Zdd�Zddd�ZeZd d �Zd d �Zd d�Z dd�Z dd�Z dS)�_RLockcCst�|_d|_d|_dS)Nr)�_allocate_lock�_block�_owner�_count)�selfr r r!�__init__asz_RLock.__init__cCs^|j}yt|j}Wntk r(YnXd|jj�r:dnd|jj|jj||j t t |��fS)Nz)<%s %s.%s object owner=%r count=%d at %s>�lockedZunlocked) r*�_active�name�KeyErrorr)r.� __class__� __module__� __qualname__r+�hex�id)r,�ownerr r r!�__repr__fsz_RLock.__repr__T�cCsDt�}|j|kr"|jd7_dS|jj||�}|r@||_d|_|S)Nr9)r r*r+r)�acquire)r,�blocking�timeout�me�rcr r r!r:us z_RLock.acquirecCs<|jt�krtd��|jd|_}|s8d|_|jj�dS)Nzcannot release un-acquired lockr9)r*r � RuntimeErrorr+r)�release)r,rr r r!r@�s  z_RLock.releasecCs |j�dS)N)r@)r,�t�v�tbr r r!�__exit__�sz_RLock.__exit__cCs|jj�|\|_|_dS)N)r)r:r+r*)r,�stater r r!�_acquire_restore�s z_RLock._acquire_restorecCs<|jdkrtd��|j}d|_|j}d|_|jj�||fS)Nrzcannot release un-acquired lock)r+r?r*r)r@)r,rr7r r r!� _release_save�s  z_RLock._release_savecCs |jt�kS)N)r*r )r,r r r!� _is_owned�sz_RLock._is_ownedN�����)TrI) �__name__r3r4r-r8r:� __enter__r@rDrFrGrHr r r r!r'Ws  $ r'c@speZdZddd�Zdd�Zdd�Zdd �Zd d �Zd d �Zdd�Z ddd�Z ddd�Z ddd�Z dd�Z e ZdS)r NcCs�|dkrt�}||_|j|_|j|_y |j|_Wntk rDYnXy |j|_Wntk rfYnXy |j|_Wntk r�YnXt�|_ dS)N) r�_lockr:r@rG�AttributeErrorrFrH�_deque�_waiters)r,�lockr r r!r-�s$   zCondition.__init__cCs |jj�S)N)rLrK)r,r r r!rK�szCondition.__enter__cGs |jj|�S)N)rLrD)r,r%r r r!rD�szCondition.__exit__cCsd|jt|j�fS)Nz)rL�lenrO)r,r r r!r8�szCondition.__repr__cCs|jj�dS)N)rLr@)r,r r r!rG�szCondition._release_savecCs|jj�dS)N)rLr:)r,�xr r r!rF�szCondition._acquire_restorecCs"|jjd�r|jj�dSdSdS)NrFT)rLr:r@)r,r r r!rH�s  zCondition._is_ownedcCs�|j�std��t�}|j�|jj|�|j�}d}z�|dkrN|j�d}nj|dkr�t�|}d}xR|jd�}|rvPt|t�|�}|dkr�Pt|d|d�}t |�qfWn |jd�}|S|j |�|s�y|jj |�Wnt k r�YnXXdS)Nzcannot wait on un-acquired lockFTrg����Mb@?�g�������?) rHr?r(r:rO�appendrG�_time�min�_sleeprF�remove� ValueError)r,r<�waiterZ saved_stateZgotit�endtimeZdelayZ remainingr r r!�waits>     zCondition.waitcCs\d}|}|�}xH|sV|dk rD|dkr0t�|}n|t�}|dkrDP|j|�|�}qW|S)Nr)rUr\)r,Z predicater<r[Zwaittime�resultr r r!�wait_forIs    zCondition.wait_forr9c Csj|j�std��|j}tt||��}|s,dSx8|D]0}|j�y|j|�Wq2tk r`Yq2Xq2WdS)Nz!cannot notify on un-acquired lock)rHr?rOrN�_islicer@rXrY)r,�nZ all_waitersZwaiters_to_notifyrZr r r!�notify`s  zCondition.notifycCs|jt|j��dS)N)rarQrO)r,r r r!� notify_allwszCondition.notify_all)N)N)N)r9)rJr3r4r-rKrDr8rGrFrHr\r^rarbZ notifyAllr r r r!r �s  B   c@s4eZdZd dd�Zd dd�ZeZdd �Zd d �ZdS)rr9cCs&|dkrtd��tt��|_||_dS)Nrz$semaphore initial value must be >= 0)rYr r�_cond�_value)r,�valuer r r!r-�s zSemaphore.__init__TNc Cs�| r|dk rtd��d}d}|j�jxb|jdkrv|s8P|dk rh|dkrTt�|}n|t�}|dkrhP|jj|�q(W|jd8_d}WdQRX|S)Nz.can't specify timeout for non-blocking acquireFrr9T)rYrcrdrUr\)r,r;r<r>r[r r r!r:�s$   zSemaphore.acquirec Cs.|j�|jd7_|jj�WdQRXdS)Nr9)rcrdra)r,r r r!r@�szSemaphore.releasecCs |j�dS)N)r@)r,rArBrCr r r!rD�szSemaphore.__exit__)r9)TN)rJr3r4r-r:rKr@rDr r r r!r�s   - c@seZdZddd�Zdd�ZdS)rr9cCstj||�||_dS)N)rr-�_initial_value)r,rer r r!r-�s zBoundedSemaphore.__init__c CsB|j�2|j|jkrtd��|jd7_|jj�WdQRXdS)Nz!Semaphore released too many timesr9)rcrdrfrYra)r,r r r!r@�s  zBoundedSemaphore.releaseN)r9)rJr3r4r-r@r r r r!r�s c@sBeZdZdd�Zdd�Zdd�ZeZdd�Zd d �Zdd d �Z d S)rcCstt��|_d|_dS)NF)r rrc�_flag)r,r r r!r-s zEvent.__init__cCs|jjt��dS)N)rcr-r)r,r r r!�_reset_internal_locksszEvent._reset_internal_lockscCs|jS)N)rg)r,r r r!�is_set sz Event.is_setc Cs&|j�d|_|jj�WdQRXdS)NT)rcrgrb)r,r r r!�setsz Event.setc Cs|j� d|_WdQRXdS)NF)rcrg)r,r r r!�clearsz Event.clearNc Cs,|j�|j}|s|jj|�}|SQRXdS)N)rcrgr\)r,r<Zsignaledr r r!r\'s  z Event.wait)N) rJr3r4r-rhriZisSetrjrkr\r r r r!r�s   c@s|eZdZddd�Zddd�Zdd�Zdd �Zd d �Zd d �Zdd�Z dd�Z dd�Z e dd��Z e dd��Ze dd��ZdS)rNcCs.tt��|_||_||_||_d|_d|_dS)Nr)r rrc�_action�_timeout�_parties�_stater+)r,�parties�actionr<r r r!r-Qs zBarrier.__init__cCs�|dkr|j}|j�b|j�|j}|jd7_z&|d|jkrL|j�n |j|�|S|jd8_|j�XWdQRXdS)Nr9)rmrc�_enterr+rn�_release�_wait�_exit)r,r<�indexr r r!r\as   z Barrier.waitcCs,x|jdkr|jj�qW|jdkr(t�dS)Nr9rrI)rIr9)rorcr\r)r,r r r!rrs   zBarrier._enterc Cs>y"|jr|j�d|_|jj�Wn|j��YnXdS)Nr9)rlrorcrb�_break)r,r r r!rs�szBarrier._releasecs4�jj�fdd�|�s"�j�t��jdkr0t�dS)Ncs �jdkS)Nr)ror )r,r r!��szBarrier._wait..r)rcr^rwrro)r,r<r )r,r!rt�s  z Barrier._waitcCs(|jdkr$|jdkr$d|_|jj�dS)Nrr9rI)rIr9)r+rorcrb)r,r r r!ru�s  z Barrier._exitc CsT|j�D|jdkr6|jdkr$d|_q<|jdkr||_n t�j|_d|_ d|_ t �|_ d|_ d|_tj|_tj|�dS)NFT)�_target�strr��_name�_args�_kwargs� _daemonicr r��_ident� _tstate_lockr�_started� _is_stopped� _initialized�_sys�stderr�_stderr� _dangling�add)r,�group�targetr0r%r&r�r r r!r- s  zThread.__init__cCs(|jj�|r|j�n d|_d|_dS)NT)r�rh�_set_tstate_lockr�r�)r,�is_aliver r r!rh7s   zThread._reset_internal_lockscCs^d}|jj�rd}|j�|jr$d}|jr2|d7}|jdk rJ|d|j7}d|jj|j|fS)N�initialZstartedZstoppedz daemonz %sz <%s(%s, %s)>) r�rir�r�r�r�r2rJr�)r,Zstatusr r r!r8Cs  zThread.__repr__cCs�|jstd��|jj�r td��t�|t|<WdQRXyt|jf�Wn,tk rtt� t|=WdQRX�YnX|jj �dS)Nzthread.__init__() not calledz threads can only be started once) r�r?r�ri�_active_limbo_lock�_limbo�_start_new_thread� _bootstrap� Exceptionr\)r,r r r!�startQs  z Thread.startc Cs.z|jr|j|j|j�Wd|`|`|`XdS)N)r�r�r�)r,r r r!�runjs z Thread.runc Cs2y |j�Wn |jr&tdkr&dS�YnXdS)N)�_bootstrap_innerr�r�)r,r r r!r�{s  zThread._bootstrapcCs t�|_dS)N)r r�)r,r r r!� _set_ident�szThread._set_identcCst�|_|jj�dS)N)� _set_sentinelr�r:)r,r r r!r��szThread._set_tstate_lockc2Cs��zT|j�|j�|jj�t�|t|j<t|=WdQRXtrLt j t�t rZt j t �z�y |j �Wn�tk r|Yn�t r�t jdk r�td|jt�ft jd�n�|jdk �rH|j�\}}}zxtd|jd|jd�td|jd�x6|�r$td|jjj|j|jjjf|jd�|j}q�Wtd||f|jd�Wd~~~XYnXWdXWdt� y tt�=Wn YnXWdQRXXdS)NzException in thread %s: %s)�filezException 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�rjr�r/r�r�r"r�rrrr�� SystemExitr��printr0� _format_excr�� _exc_info�tb_frame�f_code� co_filename� tb_lineno�co_name�tb_nextr )r,�exc_type� exc_valueZexc_tbr r r!r��sT         zThread._bootstrap_innercCs|j}|dk rd|_d|_dS)NT)r�r�)r,rPr r r!�_stop�sz Thread._stopcCsByt�tt�=WdQRXWn tk r<dtjkr8�YnXdS)NZdummy_threading)r�r/r r1r��modules)r,r r r!�_delete�s  zThread._deletecCsZ|jstd��|jj�s td��|t�kr2td��|dkrD|j�n|jt|d�d�dS)NzThread.__init__() not calledz'cannot join thread before it is startedzcannot join current threadr)r<)r�r?r�rir �_wait_for_tstate_lock�max)r,r<r r r!�joins   z Thread.joinTr9cCs0|j}|dkrn|j||�r,|j�|j�dS)N)r�r:r@r�)r,�blockr<rPr r r!r�;s  zThread._wait_for_tstate_lockcCs|jS)N)r�)r,r r r!r0Is z Thread.namecCst|�|_dS)N)r�r�)r,r0r r r!r0TscCs|jS)N)r�)r,r r r!�identYs z Thread.identcCs(|js|jj� rdS|jd�|j S)NF)r�r�rir�)r,r r r!r�es  zThread.is_alivecCs|jS)N)r�)r,r r r!r�usz Thread.daemoncCs*|jstd��|jj�r td��||_dS)NzThread.__init__() not calledz)cannot set daemon status of active thread)r�r?r�rir�)r,�daemonicr r r!r��s  cCs|jS)N)r�)r,r r r!�isDaemon�szThread.isDaemoncCs ||_dS)N)r�)r,r�r r r!� setDaemon�szThread.setDaemoncCs|jS)N)r0)r,r r r!�getName�szThread.getNamecCs ||_dS)N)r0)r,r0r r r!�setName�szThread.setName)NrI)TrI)rJr3r4r�r��exc_infor�r-rhr8r�r�r�r�r�r�r�r�r�r�r~r0�setterr�r�ZisAliver�r�r�r�r�r r r r!r�s6 , A# &    c@s&eZdZddd�Zdd�Zdd�ZdS) rNcCsFtj|�||_||_|dk r"|ng|_|dk r4|ni|_t�|_dS)N)rr-�interval�functionr%r&r�finished)r,r�r�r%r&r r r!r-�s  zTimer.__init__cCs|jj�dS)N)r�rj)r,r r r!�cancel�sz Timer.cancelcCs6|jj|j�|jj�s(|j|j|j�|jj�dS)N)r�r\r�rir�r%r&rj)r,r r r!r��s z Timer.run)NN)rJr3r4r-r�r�r r r r!r�s c@seZdZdd�ZdS)� _MainThreadc CsHtj|ddd�|j�|jj�|j�t�|t|j<WdQRXdS)NZ MainThreadF)r0r�) rr-r�r�rjr�r�r/r�)r,r r r!r-�s  z_MainThread.__init__N)rJr3r4r-r r r r!r��sr�c@s.eZdZdd�Zdd�Zdd�Zd dd �ZdS) � _DummyThreadc CsDtj|td�dd�|jj�|j�t�|t|j<WdQRXdS)NzDummy-%dT)r0r�) rr-r�r�rjr�r�r/r�)r,r r r!r-�s  z_DummyThread.__init__cCsdS)Nr )r,r r r!r��sz_DummyThread._stopcCsdS)NTr )r,r r r!r��sz_DummyThread.is_aliveNcCsdS)Nr )r,r<r r r!r��sz_DummyThread.join)N)rJr3r4r-r�r�r�r r r r!r��sr�c Cs&y tt�Stk r t�SXdS)N)r/r r1r�r r r r!r �s c Cs t�tt�tt�SQRXdS)N)r�rQr/r�r r r r!r �scCsttj��ttj��S)N)�listr/�valuesr�r r r r!� _enumerate�sr�c Cs(t�ttj��ttj��SQRXdS)N)r�r�r/r�r�r r r r!r s)rcCs8tj}|j�tj�t�}x|r2|j�t�}qWdS)N)� _main_threadr�r@r��_pickSomeNonDaemonThreadr�)ZtlockrAr r r!� _shutdownsr�cCs(x"t�D]}|j r|j�r|SqWdS)N)r r�r�)rAr r r!r�&s r�cCstS)N)r�r r r r!r,s)�_local)rc Cs�t�ai}t�}|at�|tt��}|jt�xF|D]>}||kr`|jd�t �}||_ |||<q4|jd�|j �q4Wt j �tj �tj|�WdQRXdS)NTF)rr�r r�rjr��updater�rhr r�r�r�rkr/)Z new_activeZcurrentZthreadsZthreadr�r r r!� _after_fork=s&        r�)r)L�sysr��_threadZtimerrUrrW� tracebackrr�� _weakrefsetr� itertoolsrr_rr+� _collectionsrrN� ImportError� collections�__all__�start_new_threadr�� allocate_lockr(r�r �errorrrr#rMrrr"rrrr'r$r rrrrr?r�__next__r�r�r�r/r�r�rrr�r�r Z currentThreadr Z activeCountr�r rr�r�r�rr�rZ_threading_localr�r r r r!�s�          q9P&O '