
    /g`O                       S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  SSKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJrJr  \" SS9 " S S5      5       r\" SS9 " S S5      5       r\" SS9 " S S5      5       r\" SS9 " S S5      5       r\" SS9 " S S5      5       r " S S5      r " S S\5      r " S S5      r " S  S!\5      r " S" S#5      r " S$ S%5      r  " S& S'\ 5      r! " S( S)5      r" " S* S+\"5      r# " S, S-5      r$g).    )annotationsN)deque)	dataclass)TracebackType)AsyncLibraryNotFoundError   )
checkpoint   )get_async_backend)BusyResourceError)CancelScope)TaskInfoget_current_taskT)frozenc                  $    \ rS rSr% SrS\S'   Srg)EventStatistics   zJ
:ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait`
inttasks_waiting N__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       >/usr/lib/python3/dist-packages/anyio/_core/_synchronization.pyr   r      s     r   r   c                  B    \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
rg)CapacityLimiterStatistics   az  
:ivar int borrowed_tokens: number of tokens currently borrowed by tasks
:ivar float total_tokens: total number of available tokens
:ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from
    this limiter
:ivar int tasks_waiting: number of tasks waiting on
    :meth:`~.CapacityLimiter.acquire` or
    :meth:`~.CapacityLimiter.acquire_on_behalf_of`
r   borrowed_tokensfloattotal_tokensztuple[object, ...]	borrowersr   r   Nr   r   r   r    r"   r"      s!     !!r   r"   c                  8    \ rS rSr% SrS\S'   S\S'   S\S'   S	rg
)LockStatistics,   a   
:ivar bool locked: flag indicating if this lock is locked or not
:ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the
    lock is not held by any task)
:ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire`
boollockedTaskInfo | Noneownerr   r   r   Nr   r   r   r    r)   r)   ,   s     Lr   r)   c                  .    \ rS rSr% SrS\S'   S\S'   Srg)	ConditionStatistics:   z
:ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait`
:ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying
    :class:`~.Lock`
r   r   r)   lock_statisticsr   Nr   r   r   r    r0   r0   :   s     ##r   r0   c                  $    \ rS rSr% SrS\S'   Srg)SemaphoreStatisticsF   zR
:ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire`

r   r   r   Nr   r   r   r    r4   r4   F   s    
 r   r4   c                  F    \ rS rSrS	S jrS
S jrSS jrS
S jrSS jrSr	g)EventP   c                h     [        5       R                  5       $ ! [         a    [        5       s $ f = fN)r   create_eventr   EventAdapterclss    r    __new__Event.__new__Q   s0    	"$&3355( 	">!	"s    11c                    [         e)z&Set the flag, notifying all listeners.NotImplementedErrorselfs    r    set	Event.setW       !!r   c                    [         e)z5Return ``True`` if the flag is set, ``False`` if not.rB   rD   s    r    is_setEvent.is_set[   rH   r   c                   #    [         e7f)zz
Wait until the flag has been set.

If the flag has already been set when this method is called, it returns
immediately.

rB   rD   s    r    wait
Event.wait_   s      "!   	c                    [         e)z8Return statistics about the current state of this event.rB   rD   s    r    
statisticsEvent.statisticsi   rH   r   r   Nreturnr7   rT   NonerT   r+   rT   r   )
r   r   r   r   r?   rF   rJ   rM   rQ   r   r   r   r    r7   r7   P   s    """""r   r7   c                  x    \ rS rSr% SrS\S'   SrS\S'   SS jr\SS	 j5       r	SS
 jr
SS jrSS jrSS jrSrg)r<   n   NzEvent | None_internal_eventFr+   _is_setc                ,    [         R                  U 5      $ r:   objectr?   r=   s    r    r?   EventAdapter.__new__r       ~~c""r   c                    U R                   cH  [        5       R                  5       U l         U R                  (       a  U R                   R	                  5         U R                   $ r:   )r[   r   r;   r\   rF   rD   s    r    _eventEventAdapter._eventu   sG    '#4#6#C#C#ED ||$$((*###r   c                b    U R                   c  SU l        g U R                  R                  5         g NT)r[   r\   rc   rF   rD   s    r    rF   EventAdapter.set~   s#    'DLKKOOr   c                h    U R                   c  U R                  $ U R                   R                  5       $ r:   )r[   r\   rJ   rD   s    r    rJ   EventAdapter.is_set   s-    '<<##**,,r   c                T   #    U R                   R                  5       I S h  vN   g  N7fr:   )rc   rM   rD   s    r    rM   EventAdapter.wait   s     kk      (&(c                b    U R                   c	  [        SS9$ U R                   R                  5       $ Nr   )r   )r[   r   rQ   rD   s    r    rQ   EventAdapter.statistics   s.    '"33##..00r   )r[   r\   )rT   r<   rS   rU   rW   rX   )r   r   r   r   r[   r   r\   r?   propertyrc   rF   rJ   rM   rQ   r   r   r   r    r<   r<   n   sC    $(O\(GT# $ $-!1r   r<   c                  |    \ rS rSrSS.SS jjrSS jr        SS jrSS jrSS jrSS	 jr	SS
 jr
SS jrSrg)Lock   Ffast_acquirec               d     [        5       R                  US9$ ! [         a    [        US9s $ f = fNrt   )r   create_lockr   LockAdapterr>   ru   s     r    r?   Lock.__new__   s8    	:$&222MM( 	:L99	:s    //c                @   #    U R                  5       I S h  vN   g  N7fr:   acquirerD   s    r    
__aenter__Lock.__aenter__        lln   c                ,   #    U R                  5         g 7fr:   releaserE   exc_typeexc_valexc_tbs       r    	__aexit__Lock.__aexit__         	   c                   #    [         e7f)Acquire the lock.rB   rD   s    r    r~   Lock.acquire        !!rO   c                    [         e)_
Acquire the lock, without blocking.

:raises ~anyio.WouldBlock: if the operation would block

rB   rD   s    r    acquire_nowaitLock.acquire_nowait   
     "!r   c                    [         e)Release the lock.rB   rD   s    r    r   Lock.release   rH   r   c                    [         ez*Return True if the lock is currently held.rB   rD   s    r    r,   Lock.locked   rH   r   c                    [         e)zP
Return statistics about the current state of this lock.

.. versionadded:: 3.0
rB   rD   s    r    rQ   Lock.statistics   
     "!r   r   N)ru   r+   rT   rr   rU   r   type[BaseException] | Noner   BaseException | Noner   TracebackType | NonerT   rV   rW   rT   r)   )r   r   r   r   r?   r   r   r~   r   r   r,   rQ   r   r   r   r    rr   rr      sS    -2 :, & %	
 
"""""r   rr   c                      \ rS rSr% SrS\S'   SS.SS jjrSS.SS jjr\SS	 j5       r	SS
 jr
        SS jrSS jrSS jrSS jrSS jrSS jrSrg)ry      NLock | None_internal_lockFrt   c               ,    [         R                  U 5      $ r:   r^   rz   s     r    r?   LockAdapter.__new__   ra   r   c                   Xl         g r:   _fast_acquire)rE   ru   s     r    __init__LockAdapter.__init__   s    )r   c                    U R                   c&  [        5       R                  U R                  S9U l         U R                   $ rw   )r   r   rx   r   rD   s    r    _lockLockAdapter._lock   sA    &"3"5"A"A!// #B #D """r   c                T   #    U R                   R                  5       I S h  vN   g  N7fr:   r   r~   rD   s    r    r   LockAdapter.__aenter__   s     jj  """rl   c                \   #    U R                   b  U R                   R                  5         g g 7fr:   )r   r   r   s       r    r   LockAdapter.__aexit__   s*      *'') +s   *,c                T   #    U R                   R                  5       I Sh  vN   g N7f)r   Nr   rD   s    r    r~   LockAdapter.acquire   s     jj  """rl   c                8    U R                   R                  5         g)r   N)r   r   rD   s    r    r   LockAdapter.acquire_nowait   s     	

!!#r   c                8    U R                   R                  5         g)r   Nr   r   rD   s    r    r   LockAdapter.release       

r   c                6    U R                   R                  5       $ r   r   r,   rD   s    r    r,   LockAdapter.locked       zz  ""r   c                j    U R                   c  [        SSS5      $ U R                   R                  5       $ )zQ
Return statistics about the current state of this lock.

.. versionadded:: 3.0

NFr   )r   r)   rQ   rD   s    r    rQ   LockAdapter.statistics   s4     &!%q11""--//r   )r   r   )ru   r+   rT   ry   )ru   r+   )rT   rr   rU   r   rW   r   )r   r   r   r   r   r   r?   r   rp   r   r   r   r~   r   r   r,   rQ   r   r   r   r    ry   ry      s{    "&NK&-2 # 05 * # ##*,* &* %	*
 
*#$#
0r   ry   c                      \ rS rSr% SrS\S'   SSS jjrSS jr        SS jrSS jr	SS	 jr
SS
 jrSS jrSS jrSSS jjrSS jrSS jrSS jrSrg)	Conditioni  Nr-   _owner_taskc                R    U=(       d
    [        5       U l        [        5       U l        g r:   )rr   r   r   _waiters)rE   locks     r    r   Condition.__init__  s    ^TV
&+gr   c                @   #    U R                  5       I S h  vN   g  N7fr:   r}   rD   s    r    r   Condition.__aenter__  r   r   c                ,   #    U R                  5         g 7fr:   r   r   s       r    r   Condition.__aexit__  r   r   c                J    U R                   [        5       :w  a  [        S5      eg )Nz3The current task is not holding the underlying lock)r   r   RuntimeErrorrD   s    r    _check_acquiredCondition._check_acquired  s%    /11TUU 2r   c                r   #    U R                   R                  5       I Sh  vN   [        5       U l        g N7f)zAcquire the underlying lock.N)r   r~   r   r   rD   s    r    r~   Condition.acquire  s+     jj  """+- 	#s   757c                V    U R                   R                  5         [        5       U l        g)j
Acquire the underlying lock, without blocking.

:raises ~anyio.WouldBlock: if the operation would block

N)r   r   r   r   rD   s    r    r   Condition.acquire_nowait  s     	

!!#+-r   c                8    U R                   R                  5         g)zRelease the underlying lock.Nr   rD   s    r    r   Condition.release)  r   r   c                6    U R                   R                  5       $ )zReturn True if the lock is set.r   rD   s    r    r,   Condition.locked-  r   r   c                    U R                  5         [        U5       H.  n U R                  R                  5       nUR                  5         M0     g! [         a       gf = f)zNotify exactly n listeners.N)r   ranger   popleft
IndexErrorrF   )rE   n_events       r    notifyCondition.notify1  sR    qA--/ IIK   s   A
AAc                    U R                  5         U R                   H  nUR                  5         M     U R                  R                  5         g)zNotify all the listeners.N)r   r   rF   clearrE   r   s     r    
notify_allCondition.notify_all<  s7    ]]EIIK # 	r   c                P  #    [        5       I Sh  vN   [        5       nU R                  R                  U5        U R	                  5          UR                  5       I Sh  vN    [        SS9   U R                  5       I Sh  vN   SSS5        g N~ N2! [         a2    UR                  5       (       d  U R                  R                  U5        e f = f NP! , (       d  f       g= f! [        SS9   U R                  5       I Sh  vN    SSS5        f ! , (       d  f       f = f= f7f)zWait for a notification.NT)shield)r	   r7   r   appendr   rM   BaseExceptionrJ   remover   r~   r   s     r    rM   Condition.waitD  s     lU#		%**, D)lln$$ *) 	
  	<<>>$$U+		 % *)D)lln$$ *))s   D&B9D&B BB $	D&-CCC
D&B <CC% C
C"D&%
D#/DD
D		D#
D D##D&c                p    [        [        U R                  5      U R                  R	                  5       5      $ )zU
Return statistics about the current state of this condition.

.. versionadded:: 3.0
)r0   lenr   r   rQ   rD   s    r    rQ   Condition.statisticsU  s'     #3t}}#5tzz7L7L7NOOr   )r   r   r   r:   )r   r   rU   r   rW   )r
   )r   r   rT   rV   )rT   r0   )r   r   r   r   r   r   r   r   r   r   r~   r   r   r,   r   r   rM   rQ   r   r   r   r    r   r     sp    #'K'., & %	
 
V.
.#	%"Pr   r   c                      \ rS rSrSSS.       SS jjrSSS.     SS jjrSS jr        SS jrSS	 jrSS
 jr	SS jr
\SS j5       r\SS j5       rSS jrSrg)	Semaphorei^  NF	max_valueru   c               f     [        5       R                  XUS9$ ! [         a    [        XS9s $ f = f)Nr   r   )r   create_semaphorer   SemaphoreAdapterr>   initial_valuer   ru   s       r    r?   Semaphore.__new___  sF    	H$&77 8   ) 	H#MGG	Hs    00c                   [        U[        5      (       d  [        S5      eUS:  a  [        S5      eUb0  [        U[        5      (       d  [        S5      eX!:  a  [        S5      eX0l        g )Nz initial_value must be an integerr   zinitial_value must be >= 0z$max_value must be an integer or Nonez7max_value must be equal to or higher than initial_value)
isinstancer   	TypeError
ValueErrorr   )rE   r   r   ru   s       r    r   Semaphore.__init__m  sn     --->??19:: i-- FGG( M  *r   c                B   #    U R                  5       I S h  vN   U $  N7fr:   r}   rD   s    r    r   Semaphore.__aenter__  s     lln 	s   c                ,   #    U R                  5         g 7fr:   r   r   s       r    r   Semaphore.__aexit__  r   r   c                   #    [         e7f)z5Decrement the semaphore value, blocking if necessary.rB   rD   s    r    r~   Semaphore.acquire  r   rO   c                    [         e)r   rB   rD   s    r    r   Semaphore.acquire_nowait  r   r   c                    [         e)zIncrement the semaphore value.rB   rD   s    r    r   Semaphore.release  rH   r   c                    [         e)z#The current value of the semaphore.rB   rD   s    r    valueSemaphore.value  
     "!r   c                    [         e)z#The maximum value of the semaphore.rB   rD   s    r    r   Semaphore.max_value  r  r   c                    [         e)zU
Return statistics about the current state of this semaphore.

.. versionadded:: 3.0
rB   rD   s    r    rQ   Semaphore.statistics  r   r   r   )r   r   r   
int | Noneru   r+   rT   r   )r   r   r   r  ru   r+   rT   r   r   rU   rT   r   rT   r  rT   r4   )r   r   r   r   r?   r   r   r   r~   r   r   rp   r  r   rQ   r   r   r   r    r   r   ^  s    
 !%"HH 	H
 H 
H$ !%"** 	*
 **, & %	
 
""" " " " ""r   r   c                     ^  \ rS rSr% SrS\S'   SSS.       SS jjrSSS.       SU 4S jjjr\SS	 j5       r	SS
 jr
SS jrSS jr\SS j5       r\SS j5       rSS jrSrU =r$ )r   i  NzSemaphore | None_internal_semaphoreFr   c               ,    [         R                  U 5      $ r:   r^   r   s       r    r?   SemaphoreAdapter.__new__  s     ~~c""r   c               :   > [         TU ]  XUS9  Xl        X l        g )Nr   )superr   _initial_value
_max_value)rE   r   r   ru   	__class__s       r    r   SemaphoreAdapter.__init__  s"     	,W+#r   c                    U R                   c1  [        5       R                  U R                  U R                  S9U l         U R                   $ )Nr   )r  r   r   r"  r#  rD   s    r    
_semaphoreSemaphoreAdapter._semaphore  sG    ##+'8':'K'K##t (L (D$ '''r   c                T   #    U R                   R                  5       I S h  vN   g  N7fr:   )r'  r~   rD   s    r    r~   SemaphoreAdapter.acquire  s     oo%%'''rl   c                8    U R                   R                  5         g r:   )r'  r   rD   s    r    r   SemaphoreAdapter.acquire_nowait  s    &&(r   c                8    U R                   R                  5         g r:   )r'  r   rD   s    r    r   SemaphoreAdapter.release  s    !r   c                `    U R                   c  U R                  $ U R                  R                  $ r:   )r  r"  r'  r  rD   s    r    r  SemaphoreAdapter.value  s*    ##+&&&$$$r   c                    U R                   $ r:   )r#  rD   s    r    r   SemaphoreAdapter.max_value  s    r   c                b    U R                   c	  [        SS9$ U R                  R                  5       $ rn   )r  r4   r'  rQ   rD   s    r    rQ   SemaphoreAdapter.statistics  s,    ##+&Q77))++r   )r"  r  r#  )r   r   r   r  ru   r+   rT   r   )r   r   r   r  ru   r+   rT   rV   r  rU   r  r  r  )r   r   r   r   r  r   r?   r   rp   r'  r~   r   r   r  r   rQ   r   __classcell__)r$  s   @r    r   r     s    ,0)0 !%"## 	#
 # 
# !%"	$	$ 		$
 	$ 
	$ 	$ ( (()" % %  , ,r   r   c                      \ rS rSrSS jrSS jr        SS jr\SS j5       r\R                  SS j5       r\SS j5       r
\SS j5       rSS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrg)CapacityLimiteri  c                l     [        5       R                  U5      $ ! [         a    [        U5      s $ f = fr:   )r   create_capacity_limiterr   CapacityLimiterAdapterr>   r&   s     r    r?   CapacityLimiter.__new__  s5    	8$&>>|LL( 	8),77	8s    33c                   #    [         e7fr:   rB   rD   s    r    r   CapacityLimiter.__aenter__  s     !!rO   c                   #    [         e7fr:   rB   r   s       r    r   CapacityLimiter.__aexit__        "!rO   c                    [         e)a  
The total number of tokens available for borrowing.

This is a read-write property. If the total number of tokens is increased, the
proportionate number of tasks waiting on this limiter will be granted their
tokens.

.. versionchanged:: 3.0
    The property is now writable.

rB   rD   s    r    r&   CapacityLimiter.total_tokens  s
     "!r   c                    [         er:   rB   rE   r  s     r    r&   rC    rH   r   c                    [         e)z7The number of tokens that have currently been borrowed.rB   rD   s    r    r$   CapacityLimiter.borrowed_tokens  r  r   c                    [         e)z7The number of tokens currently available to be borrowedrB   rD   s    r    available_tokens CapacityLimiter.available_tokens  r  r   c                    [         e)z
Acquire a token for the current task without waiting for one to become
available.

:raises ~anyio.WouldBlock: if there are no tokens available for borrowing

rB   rD   s    r    r   CapacityLimiter.acquire_nowait  
     "!r   c                    [         e)z
Acquire a token without waiting for one to become available.

:param borrower: the entity borrowing a token
:raises ~anyio.WouldBlock: if there are no tokens available for borrowing

rB   rE   borrowers     r    acquire_on_behalf_of_nowait+CapacityLimiter.acquire_on_behalf_of_nowait&  rM  r   c                   #    [         e7f)zZ
Acquire a token for the current task, waiting if necessary for one to become
available.

rB   rD   s    r    r~   CapacityLimiter.acquire0  rA  rO   c                   #    [         e7f)zt
Acquire a token, waiting if necessary for one to become available.

:param borrower: the entity borrowing a token

rB   rO  s     r    acquire_on_behalf_of$CapacityLimiter.acquire_on_behalf_of8  s      "!rO   c                    [         e)z
Release the token held by the current task.

:raises RuntimeError: if the current task has not borrowed a token from this
    limiter.

rB   rD   s    r    r   CapacityLimiter.releaseA  rM  r   c                    [         e)z
Release the token held by the given borrower.

:raises RuntimeError: if the borrower has not borrowed a token from this
    limiter.

rB   rO  s     r    release_on_behalf_of$CapacityLimiter.release_on_behalf_ofK  rM  r   c                    [         e)zT
Return statistics about the current state of this limiter.

.. versionadded:: 3.0

rB   rD   s    r    rQ   CapacityLimiter.statisticsU  r   r   r   N)r&   r%   rT   r7  rU   r   r   r   r   r   r   rT   zbool | NonerT   r%   r  r%   rT   rV   r  rP  r_   rT   rV   rT   r"   )r   r   r   r   r?   r   r   rp   r&   setterr$   rI  r   rQ  r~   rV  r   r[  rQ   r   r   r   r    r7  r7    s    8""," &" %	"
 
" " " " " " " " """"""""r   r7  c                     \ rS rSr% SrS\S'   SS jrSS jr\SS j5       r	SS jr
        SS	 jr\SS
 j5       r\R                  SS j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg) r:  i_  NzCapacityLimiter | None_internal_limiterc                ,    [         R                  U 5      $ r:   r^   r;  s     r    r?   CapacityLimiterAdapter.__new__b  ra   r   c                    Xl         g r:   )r&   )rE   r&   s     r    r   CapacityLimiterAdapter.__init__e  s    (r   c                    U R                   c(  [        5       R                  U R                  5      U l         U R                   $ r:   )rf  r   r9  _total_tokensrD   s    r    _limiterCapacityLimiterAdapter._limiterh  s;    !!)%6%8%P%P""&D" %%%r   c                T   #    U R                   R                  5       I S h  vN   g  N7fr:   )rm  r   rD   s    r    r   !CapacityLimiterAdapter.__aenter__q  s     mm&&(((rl   c                V   #    U R                   R                  XU5      I S h  vN $  N7fr:   )rm  r   r   s       r    r    CapacityLimiterAdapter.__aexit__t  s$      ]],,XGGGGs    )')c                `    U R                   c  U R                  $ U R                   R                  $ r:   rf  rl  r&   rD   s    r    r&   #CapacityLimiterAdapter.total_tokens|  s,    !!)%%%%%222r   c                    [        U[        5      (       d  U[        R                  La  [	        S5      eUS:  a  [        S5      eU R                  c  Xl        g XR                  l	        g )Nz'total_tokens must be an int or math.infr
   ztotal_tokens must be >= 1)
r  r   mathinfr  r  rf  rl  rm  r&   rE  s     r    r&   ru    sX    %%%%txx*?EFFQY899!!)!&%*"r   c                J    U R                   c  gU R                   R                  $ )Nr   )rf  r$   rD   s    r    r$   &CapacityLimiterAdapter.borrowed_tokens  s#    !!)%%555r   c                `    U R                   c  U R                  $ U R                   R                  $ r:   )rf  rl  rI  rD   s    r    rI  'CapacityLimiterAdapter.available_tokens  s,    !!)%%%%%666r   c                8    U R                   R                  5         g r:   )rm  r   rD   s    r    r   %CapacityLimiterAdapter.acquire_nowait  s    $$&r   c                :    U R                   R                  U5        g r:   )rm  rQ  rO  s     r    rQ  2CapacityLimiterAdapter.acquire_on_behalf_of_nowait  s    11(;r   c                T   #    U R                   R                  5       I S h  vN   g  N7fr:   )rm  r~   rD   s    r    r~   CapacityLimiterAdapter.acquire  s     mm##%%%rl   c                V   #    U R                   R                  U5      I S h  vN   g  N7fr:   )rm  rV  rO  s     r    rV  +CapacityLimiterAdapter.acquire_on_behalf_of  s     mm00:::s   )')c                8    U R                   R                  5         g r:   )rm  r   rD   s    r    r   CapacityLimiterAdapter.release  s    r   c                :    U R                   R                  U5        g r:   )rm  r[  rO  s     r    r[  +CapacityLimiterAdapter.release_on_behalf_of  s    **84r   c                |    U R                   c  [        SU R                  SSS9$ U R                   R                  5       $ )Nr   r   )r$   r&   r'   r   )rf  r"   r&   rQ   rD   s    r    rQ   !CapacityLimiterAdapter.statistics  sD    !!), !!..	  %%0022r   rt  )r&   r%   rT   r:  )r&   r%   rT   rV   )rT   r7  rU   r_  r`  ra  r  rb  rc  )r   r   r   r   rf  r   r?   r   rp   rm  r   r   r&   rd  r$   rI  r   rQ  r~   rV  r   r[  rQ   r   r   r   r    r:  r:  _  s    04-4#) & &)H,H &H %	H
 
H 3 3 
+ 
+ 6 6 7 7'<&; 5	3r   r:  c                  N    \ rS rSrSrSrS	S
S jjrSS jr        SS jrSr	g)ResourceGuardi  a  
A context manager for ensuring that a resource is only used by a single task at a
time.

Entering this context manager while the previous has not exited it yet will trigger
:exc:`BusyResourceError`.

:param action: the action to guard against (visible in the :exc:`BusyResourceError`
    when triggered, e.g. "Another task is already {action} this resource")

.. versionadded:: 4.1
action_guardedc                    Xl         SU l        g NFr  )rE   r  s     r    r   ResourceGuard.__init__  s    !r   c                ^    U R                   (       a  [        U R                  5      eSU l         g rf   )r  r   r  rD   s    r    	__enter__ResourceGuard.__enter__  s    ==#DKK00r   c                    SU l         g r  )r  r   s       r    __exit__ResourceGuard.__exit__  s     r   )r  r  N)using)r  strrU   r   )
r   r   r   r   r   	__slots__r   r  r  r   r   r   r    r  r    sC     %I, & %	
 
r   r  )%
__future__r   rw  collectionsr   dataclassesr   typesr   sniffior   lowlevelr	   
_eventloopr   _exceptionsr   _tasksr   _testingr   r   r   r"   r)   r0   r4   r7   r<   rr   ry   r   r   r   r7  r:  r  r   r   r    <module>r     s:   "   !  - ! ) *  0 $   $  " $
 
 
 $$ $ $ $  " "<#15 #1L-" -"`=0$ =0@WP WPtQ" Q"h8,y 8,vo" o"dZ3_ Z3z   r   