U
    bh                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ ejd
ZdZG dd dejZdS )zScheduler for Python functions.

.. note::
    This is used for the thread-based worker only,
    not for amqp/redis/sqs/qpid where :mod:`kombu.asynchronous.timer` is used.
    N)count)TIMEOUT_MAX)sleep)AnyCallableIteratorOptionalTuple)Entry)Timer)loggerto_timestampTIMER_DEBUG)r
   Scheduler   r   c                	       s  e Zd ZU dZeZeZdZeed< dZ	e
eegdf  ed< edZeed< erfeedd fd	d
Zd6e
e e
eegdf  e
eegdf  e
ed gdf  e
e edd fddZe
e dddZe ZZddddZddddZddddZeeeedddZd7eee
e edddZeeedddZeeeddd Zeeedd!d"Z eeedd#d$Z!d8eedd&d'd(Z"edd)d*d+Z#ddd,d-Z$edd.d/Z%edd0d1Z&edd2d3Z'e'Z(e)e*dd4d5Z+  Z,S )9r   z^Timer thread.

    Note:
        This is only used for transports not supporting AsyncIO.
    FrunningNon_tick   _timer_count)argskwargsreturnc                    s*   dd l }td |  t j|| d S )Nr   z- Timer starting)	tracebackprintprint_stacksuperstart)selfr   r   r   	__class__ 7/tmp/pip-unpacked-wheel-kcem4wq5/celery/utils/timer2.pyr   (   s    zTimer.start)scheduleon_errorr   on_startmax_intervalr   r   c                    sx   |p| j ||d| _|| _|p"| j| _t   t | _t | _	t
 | _t| j| _d| _dt| j | _d S )N)r"   r$   TzTimer-)r   r!   r#   r   r   __init__	threadingEvent_Timer__is_shutdown_Timer__is_stoppedLockmutex	Condition	not_emptydaemonnextr   name)r   r!   r"   r   r#   r$   r   r   r   r    r%   .   s    




zTimer.__init__)r   c              
   C   sX   | j @ t| j\}}|d krB|d kr2| j d |W  5 Q R  S W 5 Q R X | j|S )Ng      ?)r-   r/   	schedulerwaitr!   Zapply_entry)r   delayentryr   r   r    _next_entryC   s    zTimer._next_entryc              
   C   s   ztd| _ t| j| _| j sN|  }|r| jr:| | td krDqNt| qz| j	
  W n tk
rp   Y nX W nF tk
r } z(tjd|dd tj  td W 5 d }~X Y nX d S )NTzThread Timer crashed: %r)exc_infor   )r   iterr!   r1   r(   is_setr5   r   r   r)   set	TypeError	Exceptionr   errorsysstderrflushos_exit)r   r3   excr   r   r    runO   s&    




z	Timer.runc                 C   s.   | j   | jr*| j  | t d| _d S )NF)r(   r9   r   r)   r2   joinTHREAD_TIMEOUT_MAXr   r   r   r    stopg   s
    


z
Timer.stopc                 C   s*   | j s&|  s&| jr| |  |   d S N)r   is_aliver#   r   rF   r   r   r    ensure_startedn   s    
zTimer.ensure_started)methr   r   r   c              
   O   sF   |    | j. t| j|||}| j  |W  5 Q R  S Q R X d S rH   )rJ   r+   getattrr!   r-   notify)r   rK   r   r   r4   r   r   r    	_do_entert   s
    
zTimer._do_enter)r4   etapriorityr   c                 C   s   | j d|||dS )NZenter_at)rP   rN   )r   r4   rO   rP   r   r   r    enter{   s    zTimer.enterc                 O   s   | j d||S )Ncall_at)rS   rQ   r   r   r   r   r   r    rS   ~   s    zTimer.call_atc                 O   s   | j d||S )Nenter_after)rU   rQ   rT   r   r   r    rU      s    zTimer.enter_afterc                 O   s   | j d||S )N
call_after)rV   rQ   rT   r   r   r    rV      s    zTimer.call_afterc                 O   s   | j d||S )Ncall_repeatedly)rW   rQ   rT   r   r   r    rW      s    zTimer.call_repeatedly
   )secsrP   r   c                 C   s   |  |tj| d S rH   )rV   r=   exit)r   rY   rP   r   r   r    
exit_after   s    zTimer.exit_after)trefr   c                 C   s   |   d S rH   )cancel)r   r\   r   r   r    r]      s    zTimer.cancelc                 C   s   | j   d S rH   )r!   clearrF   r   r   r    r^      s    zTimer.clearc                 C   s
   t |  S rH   )lenrF   r   r   r    empty   s    zTimer.emptyc                 C   s
   t | jS rH   )r_   r!   rF   r   r   r    __len__   s    zTimer.__len__c                 C   s   dS )z``bool(timer)``.Tr   rF   r   r   r    __bool__   s    zTimer.__bool__c                 C   s   | j jS rH   )r!   queuerF   r   r   r    rc      s    zTimer.queue)NNNNN)N)rX   )-__name__
__module____qualname____doc__r
   r   r   bool__annotations__r   r   r   floatr   r   r   r   r   r;   r%   r5   __next__r/   rC   rG   rJ   strrN   intrR   rS   rU   rV   rW   r[   r]   r^   r`   ra   rb   __nonzero__propertylistrc   __classcell__r   r   r   r    r      sR   
       
r   )rg   r@   r=   r&   	itertoolsr   r   rE   timer   typingr   r   r   r   r	   Zkombu.asynchronous.timerr
   r   r   r   r   environgetr   __all__Threadr   r   r   r    <module>   s   