
    "                         d dl Z d dlZd dlmZ dZ e j
                  e      Zd Z G d de	      Z
 G d de      Z G d	 d
e	      Z G d de	      Zy)    N)	monotonic   c                      | D ]  }||c S  y)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                   *    e Zd ZdZddZd Zd Zd Zy)	LockStackzSimple 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                 <    g | _         t        |t              | _        y N)_stackr
   LOG_logger)selfloggers     r	   __init__zLockStack.__init__/   s    *637r   c                 `    |j                         }|r| j                  j                  |       |S r   )acquirer   append)r   lockgottens      r	   acquire_lockzLockStack.acquire_lock3   s'    KKt$r   c                     | S r   r   r   s    r	   	__enter__zLockStack.__enter__9   s    r   c                    t        | j                        }|}| j                  r>| j                  j                         }	 |j                          |dz  }| j                  r=y y # t        $ r  | j
                  j                  d||       Y <w xY w)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__zLockStack.__exit__<   s    dkk"kk;;??$DP qLG kk  P&& (>?FPPs   A# #&BBr   )__name__
__module____qualname____doc__r   r   r   r+   r   r   r	   r   r   '   s    8
r   r   c                       e Zd ZdZy)
RetryAgainz1Exception to signal to retry helper to try again.N)r,   r-   r.   r/   r   r   r	   r1   r1   I   s    ;r   r1   c                   6    e Zd ZdZej
                  dfdZd Zy)RetryzA little retry helper object.Nc                 J    || _         d| _        || _        || _        || _        y )Nr   )delayattempts	max_delay
sleep_funcwatch)r   r5   r7   r8   r9   s        r	   r   zRetry.__init__P   s%    
"$
r   c                 f   	 | xj                   dz  c_         	  ||i |S # t        $ r | j                   | j                  z  }|| j                  k  r|}n| j                  }t	        d|      }| j
                  #| j
                  j                         }|||k  r|}| j                  |       Y nw xY w)Nr            )r6   r1   r5   r7   maxr9   leftoverr8   )r   fnargskwargsmaybe_delayactual_delayr=   s          r	   __call__zRetry.__call__X   s    MMQM.4*6** ."mmdjj8/#.L#'>>L"35::)#zz224H+<0G'/-.	 s     BB/.B/)r,   r-   r.   r/   timesleepr   rC   r   r   r	   r3   r3   M   s    ' !JJd.r   r3   c                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)	StopWatchzA really basic stop watch.Nc                 .    || _         d | _        d | _        y r   )duration
started_at
stopped_at)r   rI   s     r	   r   zStopWatch.__init__n   s     r   c                 j    | j                   y t        d| j                   | j                         z
        S Nr;   )rI   r<   elapsedr   s    r	   r=   zStopWatch.leftovers   s+    == 3677r   c                 z    | j                   | j                   }n
t               }t        d|| j                  z
        S rM   )rK   nowr<   rJ   )r   end_times     r	   rN   zStopWatch.elapsedx   s2    ??&HuH34??233r   c                 &    | j                          | S r   )startr   s    r	   r   zStopWatch.__enter__   s    

r   c                 "    t               | _        y r   )rP   rK   )r   r&   r'   r(   s       r	   r+   zStopWatch.__exit__   s    %r   c                 0    t               | _        d | _        y r   )rP   rJ   rK   r   s    r	   rS   zStopWatch.start   s    %r   c                 V    | j                   y| j                         | j                   kD  S )NF)rI   rN   r   s    r	   expiredzStopWatch.expired   s$    == <<>DMM11r   r   )r,   r-   r.   r/   r   r=   rN   r   r+   rS   rW   r   r   r	   rG   rG   k   s(    $
8
4 2r   rG   )loggingrD   r   rP   BLATHER	getLoggerr,   r   r
   objectr   r$   r1   r3   rG   r   r   r	   <module>r\      s_   (   & g! D< <.F .<#2 #2r   