U
    dO                  	   @   s   d Z ddlmZ ddlmZ ddlmZ zddlm	Z	 W n e
k
rP   dZ	Y nX dZd	dddddde	ejf	d
dZG dd dejZG dd dejZdS )zGevent execution pool.    )	monotonic)timer   )base)TimeoutN)TaskPool c
              
   K   sr   |si n|}zB||0 |	| |||||fd|fi|
W  5 Q R  W S Q R X W n |k
rl   |d| Y S X d S )N	propagateFr   )targetargskwargscallbackaccept_callbackpidtimeouttimeout_callbackr   apply_targetrestr   r   =/tmp/pip-unpacked-wheel-mu1yl971/celery/concurrency/gevent.pyapply_timeout   s    

 r   c                       s@   e Zd Z fddZdd Zdd Zdd Zed	d
 Z  Z	S )Timerc                    sJ   ddl m m} G  fddd }|| _|| _t j|| t | _d S )Nr   )GreenletGreenletExitc                       s   e Zd Z jZdS )z!Timer.__init__.<locals>._GreenletN)__name__
__module____qualname__killcancelr   r   r   r   	_Greenlet&   s   r   )	geventr   r   r   Z_GreenletExitsuper__init__set_queue)selfr   r   r   r   	__class__r   r   r"   #   s    zTimer.__init__c                 K   sR   t |t  d}| j||}| j| || j ||_||_	||_
d|_|S )Nr   F)maxr   r   Zspawn_laterr$   addlink_entry_exitentryetaprioritycanceled)r%   r-   r.   r,   r   Zsecsgr   r   r   _enter.   s    zTimer._enterc              	   C   s    z|  W 5 | j | X d S N)r$   discardr   )r%   r0   r   r   r   r+   9   s    zTimer._entry_exitc                 C   s6   | j }|r2z|   W q tk
r.   Y qX qd S r2   )r$   popr   KeyError)r%   queuer   r   r   clear?   s    zTimer.clearc                 C   s   | j S r2   )r$   r%   r   r   r   r6   G   s    zTimer.queue)
r   r   r   r"   r1   r+   r7   propertyr6   __classcell__r   r   r&   r   r   !   s   r   c                       s   e Zd ZdZeZdZdZdZdZdZ	 fddZ
dd Zd	d
 ZddddddejfddZdddZdddZedd Z  ZS )r   zGEvent Pool.FTNc                    sB   ddl m} ddlm} || _|| _|d| _t j|| d S )Nr   )	spawn_raw)Poolr   )	r    r;   Zgevent.poolr<   Zspawn_ngetr   r!   r"   )r%   r   r   r;   r<   r&   r   r   r"   W   s    zTaskPool.__init__c                 C   s   |  | j| _| jj| _d S r2   )r<   limit_poolspawn
_quick_putr8   r   r   r   on_start_   s    zTaskPool.on_startc                 C   s   | j d k	r| j   d S r2   )r?   joinr8   r   r   r   on_stopc   s    
zTaskPool.on_stopc	           
   
   K   s4   |d kr| j n|}| j|rtn||||||||dS )N)r   r   )r   rA   r   )
r%   r
   r   r   r   r   r   r   r   _r   r   r   on_applyg   s        zTaskPool.on_applyr   c                 C   s&   | j j j|7  _| j  j|7  _d S r2   r?   Z
_semaphorecountersizer%   nr   r   r   growp   s    zTaskPool.growc                 C   s&   | j j j|8  _| j  j|8  _d S r2   rG   rJ   r   r   r   shrinkt   s    zTaskPool.shrinkc                 C   s
   t | jS r2   )lenr?   r8   r   r   r   num_processesx   s    zTaskPool.num_processes)r   )r   )r   r   r   __doc__r   Zsignal_safeZis_greenZtask_join_will_blockr?   rA   r"   rB   rD   r   r   rF   rL   rM   r9   rO   r:   r   r   r&   r   r   L   s(     
	

r   )rP   timer   Zkombu.asynchronousr   Z_timer r   r    r   ImportError__all__r   r   r   ZBasePoolr   r   r   r   r   <module>   s$   
   
+