
    "                         S SK r S SKrS SKJr  Sr\ R
                  " \5      rS r " S S\	5      r
 " S S\5      r " S	 S
\	5      r " S S\	5      rg)    N)	monotonic   c                  $    U  H
  nUc  M  Us  $    g)zEReturns first of values that is *not* None (or None if all are/were).N )valuesvals     +platform/bq/third_party/fasteners/_utils.pypick_first_not_noner
      s    ?J      c                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
	LockStack'   zSimple lock stack to get and release many locks.

An instance of this should **not** be used by many threads at the
same time, as the stack that is maintained will be corrupted and
invalid if that is attempted.
Nc                 <    / U l         [        U[        5      U l        g N)_stackr
   LOG_logger)selfloggers     r	   __init__LockStack.__init__/   s    *637r   c                 j    UR                  5       nU(       a  U R                  R                  U5        U$ r   )acquirer   append)r   lockgottens      r	   acquire_lockLockStack.acquire_lock3   s'    KKt$r   c                     U $ r   r   r   s    r	   	__enter__LockStack.__enter__9   s    r   c                 4   [        U R                  5      nUnU R                  (       aD  U R                  R                  5       n UR                  5         US-  nU R                  (       a  MC  g g ! [         a    U R
                  R                  SXE5         NBf = f)Nz6Failed releasing lock %s from lock stack with %s locks   )lenr   poprelease	Exceptionr   	exception)r   exc_type	exc_valueexc_tbam_lefttot_amr   s          r	   __exit__LockStack.__exit__<   s    dkk"kk;;??$DP qLG kkk  P&& (>?FPPs   A. .&BB)r   r   r   )
__name__
__module____qualname____firstlineno____doc__r   r   r!   r/   __static_attributes__r   r   r	   r   r   '   s    8
r   r   c                       \ rS rSrSrSrg)
RetryAgainI   z1Exception to signal to retry helper to try again.r   N)r1   r2   r3   r4   r5   r6   r   r   r	   r8   r8   I   s    ;r   r8   c                   @    \ rS rSrSr\R                  S4S jrS rSr	g)RetryM   zA little retry helper object.Nc                 B    Xl         SU l        X l        X0l        X@l        g )Nr   )delayattempts	max_delay
sleep_funcwatch)r   r>   r@   rA   rB   s        r	   r   Retry.__init__P   s    
"$
r   c                 n    U =R                   S-  sl          U" U0 UD6$ ! [         a    U R                   U R                  -  nX@R                  :  a  UnOU R                  n[	        SU5      nU R
                  b$  U R
                  R                  5       nUb  Xe:  a  UnU R                  U5         Of = fM  )Nr$           )r?   r8   r>   r@   maxrB   leftoverrA   )r   fnargskwargsmaybe_delayactual_delayrG   s          r	   __call__Retry.__call__X   s    MMQM.4*6** ."mmdjj8/#.L#'>>L"35::)#zz224H+0G'/-.	 s     BB21B2)r?   r>   r@   rA   rB   )
r1   r2   r3   r4   r5   timesleepr   rM   r6   r   r   r	   r;   r;   M   s    ' !JJd.r   r;   c                   F    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rSrg)	StopWatchk   zA really basic stop watch.Nc                 ,    Xl         S U l        S U l        g r   duration
started_at
stopped_at)r   rV   s     r	   r   StopWatch.__init__n   s     r   c                 l    U R                   c  g [        SU R                   U R                  5       -
  5      $ NrE   )rV   rF   elapsedr    s    r	   rG   StopWatch.leftovers   s+    == 3677r   c                 z    U R                   b  U R                   nO
[        5       n[        SXR                  -
  5      $ r[   )rX   nowrF   rW   )r   end_times     r	   r\   StopWatch.elapsedx   s0    ??&HuH3??233r   c                 &    U R                  5         U $ r   )startr    s    r	   r!   StopWatch.__enter__   s    

r   c                 "    [        5       U l        g r   )r_   rX   )r   r*   r+   r,   s       r	   r/   StopWatch.__exit__   s    %r   c                 0    [        5       U l        S U l        g r   )r_   rW   rX   r    s    r	   rc   StopWatch.start   s    %r   c                 X    U R                   c  gU R                  5       U R                   :  $ )NF)rV   r\   r    s    r	   expiredStopWatch.expired   s$    == <<>DMM11r   rU   r   )r1   r2   r3   r4   r5   r   rG   r\   r!   r/   rc   rj   r6   r   r   r	   rR   rR   k   s(    $
8
4 2r   rR   )loggingrO   r   r_   BLATHER	getLoggerr1   r   r
   objectr   r(   r8   r;   rR   r   r   r	   <module>rp      s]   (   & ! D< <.F .<#2 #2r   