U
    d                     @   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 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)Entry)Timer)loggerto_timestampTIMER_DEBUG)r   Scheduler   r   c                       s   e Zd ZdZeZeZdZdZedZ	e
r4 fddZd, fdd	Zd	d
 Ze ZZdd Zdd Zdd Zdd Zd-ddZdd Zdd Zdd Zdd Zd.ddZd d! Zd"d# Zd$d% Zd&d' Zd(d) ZeZe d*d+ Z!  Z"S )/r   z^Timer thread.

    Note:
        This is only used for transports not supporting AsyncIO.
    FN   c                    s*   dd l }td |  t j|| d S )Nr   z- Timer starting)	tracebackprintprint_stacksuperstart)selfargskwargsr   	__class__ 7/tmp/pip-unpacked-wheel-mu1yl971/celery/utils/timer2.pyr   '   s    zTimer.startc                    sx   |p| j ||d| _|| _|p"| j| _t   t | _t | _	t
 | _t| j| _d| _dt| j | _d S )N)on_errormax_intervalTzTimer-)r
   scheduleon_starton_tickr   __init__	threadingEvent_Timer__is_shutdown_Timer__is_stoppedLockmutex	Condition	not_emptydaemonnext_timer_countname)r   r   r   r   r   r   r   r   r   r   r   -   s    




zTimer.__init__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_entry?   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   )runningiterr   r*   r    is_setr.   r   r   r!   set	TypeError	Exceptionr   errorsysstderrflushos_exit)r   r,   excr   r   r   runI   s&    




z	Timer.runc                 C   s.   | j   | jr*| j  | t d| _d S )NF)r    r3   r0   r!   r+   joinTHREAD_TIMEOUT_MAXr   r   r   r   stopa   s
    


z
Timer.stopc                 C   s*   | j s&|  s&| jr| |  |   d S N)r0   is_aliver   r   r@   r   r   r   ensure_startedh   s    
zTimer.ensure_startedc              
   O   sF   |    | j. t| j|||}| j  |W  5 Q R  S Q R X d S rB   )rD   r#   getattrr   r%   notify)r   methr   r   r-   r   r   r   	_do_entern   s
    
zTimer._do_enterc                 C   s   | j d|||dS )NZenter_at)priorityrH   )r   r-   etarI   r   r   r   enteru   s    zTimer.enterc                 O   s   | j d||S )Ncall_at)rM   rJ   r   r   r   r   r   r   rM   x   s    zTimer.call_atc                 O   s   | j d||S )Nenter_after)rO   rJ   rN   r   r   r   rO   {   s    zTimer.enter_afterc                 O   s   | j d||S )N
call_after)rP   rJ   rN   r   r   r   rP   ~   s    zTimer.call_afterc                 O   s   | j d||S )Ncall_repeatedly)rQ   rJ   rN   r   r   r   rQ      s    zTimer.call_repeatedly
   c                 C   s   |  |tj| d S rB   )rP   r7   exit)r   ZsecsrI   r   r   r   
exit_after   s    zTimer.exit_afterc                 C   s   |   d S rB   )cancel)r   Ztrefr   r   r   rU      s    zTimer.cancelc                 C   s   | j   d S rB   )r   clearr@   r   r   r   rV      s    zTimer.clearc                 C   s
   t |  S rB   )lenr@   r   r   r   empty   s    zTimer.emptyc                 C   s
   t | jS rB   )rW   r   r@   r   r   r   __len__   s    zTimer.__len__c                 C   s   dS )z``bool(timer)``.Tr   r@   r   r   r   __bool__   s    zTimer.__bool__c                 C   s   | j jS rB   )r   queuer@   r   r   r   r[      s    zTimer.queue)NNNNN)N)rR   )#__name__
__module____qualname____doc__r   r
   r0   r   r   r(   r	   r   r   r.   __next__r'   r=   rA   rD   rH   rL   rM   rO   rP   rQ   rT   rU   rV   rX   rY   rZ   __nonzero__propertyr[   __classcell__r   r   r   r   r      s@       

r   )r_   r:   r7   r   	itertoolsr   r   r?   timer   Zkombu.asynchronous.timerr   r   r
   r   r   environgetr	   __all__Threadr   r   r   r   <module>   s   