3 Qg@s|ddlZddlZddlmZmZddlm Z ddl m Z ddl mZmZyddlmZWn ek rxddlmZYnXddd d d d d ddddddddddddddgZejZejZejZejZejZy ej Z!Wne"k rdZ!YnXej#Z#[da$da%ddZ&ddZ'eZ(ddZ Gdd d Z)e)Z*Gd!d d Z+Gd"ddZ,Gd#dde,Z-Gd$ddZ.Gd%ddZ/Gd&dde0Z1ej2Z3e3d?d(d)Z4e a5iZ6iZ7e Z8Gd*ddZ9Gd+dde9Z:Gd,d-d-e9Z;Gd.d/d/e9Zd1dZ?e?Z@d2d3ZAd4d ZBdd5lmCZCe;aDd6d7ZEd8d9ZFd:d ZGydd;lmHZIWn"ek rnddZKdS)@N) monotonicsleep) format_exc)WeakSet)islicecount)deque get_ident active_count Conditioncurrent_thread enumerate main_thread TIMEOUT_MAXEventLockRLock SemaphoreBoundedSemaphoreThreadBarrierBrokenBarrierErrorTimer ThreadError setprofilesettracelocal stack_sizecCs|adS)N) _profile_hook)funcr !/usr/lib64/python3.6/threading.pyr2scCs|adS)N) _trace_hook)rr r r!r<scOstdkrt||St||S)N)_CRLock_PyRLock)argskwargsr r r!rJs  c@sReZdZddZddZdddZeZd d Zd d Zd dZ ddZ ddZ 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|jjr:dnd|jj|jj||j t t |fS)Nz)<%s %s.%s object owner=%r count=%d at %s>lockedZunlocked) r*_activenameKeyErrorr)r. __class__ __module__ __qualname__r+hexid)r,ownerr r r!__repr__fsz_RLock.__repr__TcCsDt}|j|kr"|jd7_dS|jj||}|r@||_d|_|S)Nr9)r r*r+r)acquire)r,blockingtimeoutmercr r r!r:us z_RLock.acquirecCs<|jtkrtd|jd|_}|s8d|_|jjdS)Nzcannot release un-acquired lockr9)r*r RuntimeErrorr+r)release)r,rr r r!r@s  z_RLock.releasecCs |jdS)N)r@)r,tvtbr r r!__exit__sz_RLock.__exit__cCs|jj|\|_|_dS)N)r)r:r+r*)r,stater r r!_acquire_restores 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_saves  z_RLock._release_savecCs |jtkS)N)r*r )r,r r r! _is_ownedsz_RLock._is_ownedN)TrI) __name__r3r4r-r8r: __enter__r@rDrFrGrHr r r r!r'Ws  $ r'c@speZdZdddZddZddZdd Zd d Zd d ZddZ dddZ dddZ dddZ ddZ e ZdS)r NcCs|dkrt}||_|j|_|j|_y |j|_Wntk rDYnXy |j|_Wntk rfYnXy |j|_Wntk rYnXt|_ dS)N) r_lockr:r@rGAttributeErrorrFrH_deque_waiters)r,lockr r r!r-s$   zCondition.__init__cCs |jjS)N)rLrK)r,r r r!rKszCondition.__enter__cGs |jj|S)N)rLrD)r,r%r r r!rDszCondition.__exit__cCsd|jt|jfS)Nz)rLlenrO)r,r r r!r8szCondition.__repr__cCs|jjdS)N)rLr@)r,r r r!rGszCondition._release_savecCs|jjdS)N)rLr:)r,xr r r!rFszCondition._acquire_restorecCs"|jjdr|jjdSdSdS)NrFT)rLr:r@)r,r r r!rHs  zCondition._is_ownedcCs|jstdt}|j|jj||j}d}z|dkrN|jd}nj|dkrt|}d}xR|jd}|rvPt|t|}|dkrPt|d|d}t |qfWn |jd}|S|j ||sy|jj |Wnt k rYnXXdS)Nzcannot wait on un-acquired lockFTrgMb@?g?) rHr?r(r:rOappendrG_timemin_sleeprFremove ValueError)r,r<waiterZ saved_stateZgotitendtimeZdelayZ remainingr r r!waits>     zCondition.waitcCs\d}|}|}xH|sV|dk rD|dkr0t|}n|t}|dkrDP|j||}qW|S)Nr)rUr\)r,Z predicater<r[Zwaittimeresultr r r!wait_forIs    zCondition.wait_forr9c Csj|jstd|j}tt||}|s,dSx8|D]0}|jy|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|jdS)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 ddZd ddZeZdd Zd d ZdS)rr9cCs&|dkrtdtt|_||_dS)Nrz$semaphore initial value must be >= 0)rYr r_cond_value)r,valuer r r!r-s zSemaphore.__init__TNc Cs| r|dk rtdd}d}|jjxb|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_|jjWdQRXdS)Nr9)rcrdra)r,r r r!r@szSemaphore.releasecCs |jdS)N)r@)r,rArBrCr r r!rDszSemaphore.__exit__)r9)TN)rJr3r4r-r:rKr@rDr r r r!rs   - c@seZdZdddZddZdS)rr9cCstj||||_dS)N)rr-_initial_value)r,rer r r!r-s zBoundedSemaphore.__init__c CsB|j2|j|jkrtd|jd7_|jjWdQRXdS)Nz!Semaphore released too many timesr9)rcrdrfrYra)r,r r r!r@s  zBoundedSemaphore.releaseN)r9)rJr3r4r-r@r r r r!rs c@sBeZdZddZddZddZeZddZd d Zdd d Z d S)rcCstt|_d|_dS)NF)r rrc_flag)r,r r r!r-s zEvent.__init__cCs|jjtdS)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&|jd|_|jjWdQRXdS)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!rs   c@s|eZdZdddZdddZddZdd Zd d Zd d ZddZ ddZ ddZ e ddZ e ddZe ddZdS)rNcCs.tt|_||_||_||_d|_d|_dS)Nr)r rrc_action_timeout_parties_stater+)r,partiesactionr<r r r!r-Qs zBarrier.__init__cCs|dkr|j}|jb|j|j}|jd7_z&|d|jkrL|jn |j||S|jd8_|jXWdQRXdS)Nr9)rmrc_enterr+rn_release_wait_exit)r,r<indexr r r!r\as   z Barrier.waitcCs,x|jdkr|jjqW|jdkr(tdS)Nr9rrI)rIr9)rorcr\r)r,r r r!rrs   zBarrier._enterc Cs>y"|jr|jd|_|jjWn|jYnXdS)Nr9)rlrorcrb_break)r,r r r!rsszBarrier._releasecs4jjfdd|s"jtjdkr0tdS)Ncs jdkS)Nr)ror )r,r r!szBarrier._wait..r)rcr^rwrro)r,r<r )r,r!rts  z Barrier._waitcCs(|jdkr$|jdkr$d|_|jjdS)Nrr9rI)rIr9)r+rorcrb)r,r r r!rus  z Barrier._exitc CsT|jD|jdkr6|jdkr$d|_q<|jdkr||_n tj|_d|_ d|_ t |_ d|_ d|_tj|_tj|dS)NFT)_targetstrr_name_args_kwargs _daemonicr r_ident _tstate_lockr_started _is_stopped _initialized_sysstderr_stderr _danglingadd)r,grouptargetr0r%r&rr r r!r- s  zThread.__init__cCs(|jj|r|jn d|_d|_dS)NT)rrh_set_tstate_lockrr)r,is_aliver r r!rh7s   zThread._reset_internal_lockscCs^d}|jjrd}|j|jr$d}|jr2|d7}|jdk rJ|d|j7}d|jj|j|fS)NinitialZstartedZstoppedz daemonz %sz <%s(%s, %s)>) rrirrrrr2rJr)r,Zstatusr r r!r8Cs  zThread.__repr__cCs|jstd|jjr tdt|t|<WdQRXyt|jfWn,tk rtt t|=WdQRXYnX|jj dS)Nzthread.__init__() not calledz threads can only be started once) rr?rri_active_limbo_lock_limbo_start_new_thread _bootstrap Exceptionr\)r,r r r!startQs  z Thread.startc Cs.z|jr|j|j|jWd|`|`|`XdS)N)rrr)r,r r r!runjs z Thread.runc Cs2y |jWn |jr&tdkr&dSYnXdS)N)_bootstrap_innerrr)r,r r r!r{s  zThread._bootstrapcCs t|_dS)N)r r)r,r r r! _set_identszThread._set_identcCst|_|jjdS)N) _set_sentinelrr:)r,r r r!rszThread._set_tstate_lockc2CszT|j|j|jjt|t|j<t|=WdQRXtrLt j tt rZt j t zy |j Wntk r|Ynt rt jdk rtd|jtft jdn|jdk rH|j\}}}zxtd|jd|jdtd|jdx6|r$td|jjj|j|jjjf|jd|j}qWtd||f|jdWd~~~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)rrrrjrr/rrr"rrrrr SystemExitrprintr0 _format_excr _exc_infotb_framef_code co_filename tb_linenoco_nametb_nextr )r,exc_type exc_valueZexc_tbr r r!rsT         zThread._bootstrap_innercCs|j}|dk rd|_d|_dS)NT)rr)r,rPr r r!_stopsz Thread._stopcCsByttt=WdQRXWn tk r<dtjkr8YnXdS)NZdummy_threading)rr/r r1rmodules)r,r r r!_deletes  zThread._deletecCsZ|jstd|jjs td|tkr2td|dkrD|jn|jt|dddS)NzThread.__init__() not calledz'cannot join thread before it is startedzcannot join current threadr)r<)rr?rrir _wait_for_tstate_lockmax)r,r<r r r!joins   z Thread.joinTr9cCs0|j}|dkrn|j||r,|j|jdS)N)rr: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)rr)r,r0r r r!r0TscCs|jS)N)r)r,r r r!identYs z Thread.identcCs(|js|jj rdS|jd|j S)NF)rrrir)r,r r r!res  zThread.is_alivecCs|jS)N)r)r,r r r!rusz Thread.daemoncCs*|jstd|jjr td||_dS)NzThread.__init__() not calledz)cannot set daemon status of active thread)rr?rrir)r,daemonicr r r!rs  cCs|jS)N)r)r,r r r!isDaemonszThread.isDaemoncCs ||_dS)N)r)r,rr r r! setDaemonszThread.setDaemoncCs|jS)N)r0)r,r r r!getNameszThread.getNamecCs ||_dS)N)r0)r,r0r r r!setNameszThread.setName)NrI)TrI)rJr3r4rrexc_inforr-rhr8rrrrrrrrrrr~r0setterrrZisAliverrrrrr r r r!rs6 , A# &    c@s&eZdZdddZddZddZdS) rNcCsFtj|||_||_|dk r"|ng|_|dk r4|ni|_t|_dS)N)rr-intervalfunctionr%r&rfinished)r,rrr%r&r r r!r-s  zTimer.__init__cCs|jjdS)N)rrj)r,r r r!cancelsz Timer.cancelcCs6|jj|j|jjs(|j|j|j|jjdS)N)rr\rrirr%r&rj)r,r r r!rs z Timer.run)NN)rJr3r4r-rrr r r r!rs c@seZdZddZdS) _MainThreadc CsHtj|ddd|j|jj|jt|t|j<WdQRXdS)NZ MainThreadF)r0r) rr-rrrjrrr/r)r,r r r!r-s  z_MainThread.__init__N)rJr3r4r-r r r r!rsrc@s.eZdZddZddZddZd dd ZdS) _DummyThreadc CsDtj|tddd|jj|jt|t|j<WdQRXdS)NzDummy-%dT)r0r) rr-rrrjrrr/r)r,r r r!r-s  z_DummyThread.__init__cCsdS)Nr )r,r r r!rsz_DummyThread._stopcCsdS)NTr )r,r r r!rsz_DummyThread.is_aliveNcCsdS)Nr )r,r<r r r!rsz_DummyThread.join)N)rJr3r4r-rrrr r r r!rsrc Cs&y ttStk r tSXdS)N)r/r r1rr r r r!r s c Cs tttttSQRXdS)N)rrQr/rr r r r!r scCsttjttjS)N)listr/valuesrr r r r! _enumeratesrc Cs(tttjttjSQRXdS)N)rrr/rrr r r r!r s)rcCs8tj}|jtjt}x|r2|jt}qWdS)N) _main_threadrr@r_pickSomeNonDaemonThreadr)ZtlockrAr r r! _shutdownsrcCs(x"tD]}|j r|jr|SqWdS)N)r rr)rAr r r!r&s rcCstS)N)rr r r r!r,s)_local)rc Cstai}t}|at|tt}|jtxF|D]>}||kr`|jdt }||_ |||<q4|jd|j q4Wt j tj tj|WdQRXdS)NTF)rrr rrjrupdaterrhr rrrrkr/)Z new_activeZcurrentZthreadsZthreadrr r r! _after_fork=s&        r)r)Lsysr_threadZtimerrUrrW tracebackrr _weakrefsetr itertoolsrr_rr+ _collectionsrrN ImportError collections__all__start_new_threadr allocate_lockr(rr errorrrr#rMrrr"rrrr'r$r rrrrr?r__next__rrrr/rrrrrrr Z currentThreadr Z activeCountrr rrrrrrrZ_threading_localrr r r r!s          q9P&O '