
    =h                        d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZ  G d d      Z e       ZddZdd	Zdd
Zy)z-Run a target function on a background thread.    )annotationsN)AnyCallableOptional)_create_lockc                  r    e Zd Z	 d	 	 	 	 	 	 	 ddZddZddZdddZdddZddZddZ	dd	Z
dd
ZddZy)PeriodicExecutorNc                    d| _         || _        || _        || _        d| _        d| _        || _        d| _        d| _        t               | _
        y)a   "Run a target function periodically on a background thread.

        If the target's return value is false, the executor stops.

        :Parameters:
          - `interval`: Seconds between calls to `target`.
          - `min_interval`: Minimum seconds between calls if `wake` is
            called very often.
          - `target`: A function.
          - `name`: A name to give the underlying thread.
        FN)_event	_interval_min_interval_target_stopped_thread_name_skip_sleep_thread_will_exitr   _lock)selfintervalmin_intervaltargetnames        i/var/www/html/phonemate/phone_mate_backend/venv/lib/python3.12/site-packages/pymongo/periodic_executor.py__init__zPeriodicExecutor.__init__   sO    , !)37
 !&!^
    c                j    d| j                   j                   d| j                   dt        |       ddS )N<z(name=z) object at 0xx>)	__class____name__r   idr   s    r   __repr__zPeriodicExecutor.__repr__=   s4    4>>**+6$**^BtHUV<WXYYr   c                2   | j                   5  | j                  r)	 | j                  J | j                  j                          d| _        d| _        ddd       d}	 | j                  xr | j                  j                         }|sht        j                  | j                  | j                        }d|_        t        j                  |      | _        t        |        |j                          yy# t        $ r Y w xY w# 1 sw Y   xY w# t        $ r Y w xY w)zgStart. Multiple calls have no effect.

        Not safe to call from multiple threads at once.
        NF)r   r   T)r   r   r   joinReferenceErrorr   is_alive	threadingThread_runr   daemonweakrefproxy_register_executorstart)r   startedthreads      r   openzPeriodicExecutor.open@   s    
 ZZ%%
<<333LL%%' &+D"!DM  	ll>t||'<'<'>G
 %%TYYTZZHF FM"==0DLt$LLN  &  Z"  		s@   C>(C/C>(D
 /	C;8C>:C;;C>>D
	DDc                    d| _         y)zStop. To restart, call open().

        The dummy parameter allows an executor's close method to be a weakref
        callback; see monitor.py.
        TN)r   )r   dummys     r   closezPeriodicExecutor.closea   s     r   c                    | j                   	 | j                   j                  |       y y # t        t        f$ r Y y w xY wN)r   r'   r(   RuntimeError)r   timeouts     r   r'   zPeriodicExecutor.joini   sA    <<#!!'* $ #L1 s   + ==c                    d| _         y)z!Execute the target function soon.TN)r   r$   s    r   wakezPeriodicExecutor.wakeq   s	    r   c                    || _         y r9   )r   )r   new_intervals     r   update_intervalz PeriodicExecutor.update_intervalu   s	    %r   c                    d| _         y )NT)r   r$   s    r   
skip_sleepzPeriodicExecutor.skip_sleepx   s
    r   c                    | j                   5  | j                  rd| _        	 d d d        y	 d d d        y# 1 sw Y   y xY wNTF)r   r   r   r$   s    r   __should_stopzPeriodicExecutor.__should_stop{   s1    ZZ}})-& Z 	 ZZs   55>c                T   | j                         s	 | j                         sd| _        y 	 | j                  rd| _        nt        j                         | j                  z   }| j                  sgt        j                         |k  rPt        j                  | j                         | j                  rn$| j                  st        j                         |k  rPd| _        | j                         sy y # t        $ r1 | j                  5  d| _        d| _        d d d         # 1 sw Y    xY ww xY wrD   )_PeriodicExecutor__should_stopr   r   BaseExceptionr   r   r   time	monotonicr   sleepr   r   )r   deadlines     r   r,   zPeriodicExecutor._run   s    $$&	||~$(DM & #( >>+dnn<--DNN,<x,GJJt112{{ --DNN,<x,G
  DK+ $$&
 ! ZZ$(DM-1D*   	   s#   C- -D'D	D'D#	D'r9   )r   floatr   rM   r   zCallable[[], bool]r   zOptional[str])returnstrrN   None)r6   r   rN   rQ   )r;   zOptional[int]rN   rQ   )r?   intrN   rQ   )rN   bool)r"   
__module____qualname__r   r%   r4   r7   r'   r=   r@   rB   rG   r,    r   r   r	   r	      sb     #$$ $ #	$
 $BZB&  r   r	   c                b    t        j                  | t              }t        j	                  |       y r9   )r.   ref_on_executor_deleted
_EXECUTORSadd)executorrX   s     r   r0   r0      s    
++h 4
5CNN3r   c                .    t         j                  |        y r9   )rZ   remove)rX   s    r   rY   rY      s    cr   c                     t         y t        t               } | D ]  } |       }|s|j                           | D ]  } |       }|s|j                  d        d }y )N   )rZ   listr7   r'   )	executorsrX   r\   s      r   _shutdown_executorsrc      s`     Z I 5NN  5MM! 
 Hr   )r\   r	   rN   rQ   )rX   z'weakref.ReferenceType[PeriodicExecutor]rN   rQ   rP   )__doc__
__future__r   r*   rI   r.   typingr   r   r   pymongo.lockr   r	   setrZ   r0   rY   rc   rV   r   r   <module>ri      sD    4 "    * * %}  } L U

r   