U
    bh.                     @  s&  U d Z ddlm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 dd
lmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ dZee Z!da"de#d< dZ$G dd de%Z&dd Z'edd Z(ddddZ)dddddZ*G d d! d!Z+dS )"zEvent loop implementation.    )annotationsN)contextmanager)copy)Empty)sleep)GeneratorType)Thenablepromise)
get_logger)fileno)ERRREADWRITEpoll)cached_property   )Timer)Hubget_event_loopset_event_loopz
Hub | None_current_loopz<Received unknown event %r for fd %r, please contact support!c                   @  s   e Zd ZdZdS )StopzStops the event loop.N)__name__
__module____qualname____doc__ r   r   :/tmp/pip-unpacked-wheel-earovzxb/kombu/asynchronous/hub.pyr       s   r   c                   C  s
   t  d S N)r   r   r   r   r   _raise_stop_error$   s    r   c                  o  s
   d V  d S r   r   )argskwargsr   r   r   _dummy_context(   s    r"   )returnc                   C  s   t S )zGet current event loop object.r   r   r   r   r   r   -   s    r   )loopr#   c                 C  s   | a | S )z"Set the current event loop object.r$   )r%   r   r   r   r   2   s    r   c                
   @  sN  e Zd ZdZeZeZeZdZdFddZe	dd Z
e
jdd Z
dd	 Zd
d Zdd Zdd Zdd ZdGddZdd ZdHddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#e$e%e&e'e(e)e*eeef
d<d=Z+d>d? Z,d@dA Z-e.dBdC Z/e	dDdE Z0dS )Ir   z~Event loop object.

    Arguments:
    ---------
        timer (kombu.asynchronous.Timer): Specify custom timer instance.
    Nc                 C  sn   |d k	r|nt  | _i | _i | _t | _t | _t | _t	 | _
d| _d | _t | _d | _d| _|   d S )NFr   )r   timerreaderswritersseton_tickon_close_ready	threadingLock_ready_lock_running_loopconsolidateconsolidate_callbackpropagate_errors_create_poller)selfr&   r   r   r   __init__N   s    
	zHub.__init__c                 C  s   | j s|   | j S r   )_pollerr5   r6   r   r   r   polleri   s    z
Hub.pollerc                 C  s
   || _ d S r   )r8   )r6   valuer   r   r   r:   o   s    c                 C  s   |    |   d S r   )closer5   r9   r   r   r   resets   s    z	Hub.resetc                 C  s    t  | _| jj| _| jj| _d S r   )r   r8   register_register_fd
unregister_unregister_fdr9   r   r   r   r5   w   s    
zHub._create_pollerc                 C  s*   | j d k	r&| j   d | _ d | _d | _d S r   )r8   r<   r?   rA   r9   r   r   r   _close_poller|   s
    

zHub._close_pollerc                 C  s   |  t d S r   )	call_soonr   r9   r   r   r   stop   s    zHub.stopc                 C  s   d t| t| jt| jS )Nz<Hub@{:#x}: R:{} W:{}>)formatidlenr'   r(   r9   r   r   r   __repr__   s
      zHub.__repr__r   
   r   c           
      C  s   | j }d }|r|jrt|D ]}t| j\}}|d kr: qz
|  W q |k
rZ    Y q ttfk
rr    Y q tk
r }	 z"|	jtj	kr t
jd|	dd W 5 d }	~	X Y q tk
r }	 zt
jd|	dd W 5 d }	~	X Y qX qt|p||S )NzError in timer: %rr   exc_info)r&   _queuerangenext	schedulerMemoryErrorAssertionErrorOSErrorerrnoZENOMEMloggererror	Exceptionmin)
r6   Z	min_delayZ	max_delayZ
max_timers	propagater&   delayientryexcr   r   r   fire_timers   s(    

 $zHub.fire_timersc              	   C  s    z| | W 5 |  | X d S r   )_discard_unregisterr6   fdr   r   r   _remove_from_loop   s    zHub._remove_from_loopFc                 C  sz   t |}z| j|| W n  tk
r:   | |  Y n<X |t@ rJ| jn| j}|rj| j	| d ||< n||f||< d S r   )
r   r:   r>   
ValueErrorrb   r   r'   r(   r2   add)r6   ra   callbackflagsr    r2   destr   r   r   rd      s    

zHub.addc                 C  s   t |}| | d S r   )r   rb   r`   r   r   r   remove   s    z
Hub.removec                 C  s@   d| _ z,z|   W q tk
r,   Y q0Y qX qW 5 d| _ X d S )NTF)r0   run_oncer   r9   r   r   r   run_forever   s    zHub.run_foreverc                 C  s.   zt | j W n tk
r(   d | _Y nX d S r   )rN   r%   StopIterationr1   r9   r   r   r   ri      s    zHub.run_oncec              	   G  s6   t |tst||}| j | j| W 5 Q R X |S r   )
isinstancer   r	   r/   r,   rd   )r6   re   r    r   r   r   rC      s
    

zHub.call_soonc                 G  s   | j |||S r   )r&   Z
call_afterr6   rY   re   r    r   r   r   
call_later   s    zHub.call_laterc                 G  s   | j |||S r   )r&   call_at)r6   whenre   r    r   r   r   ro      s    zHub.call_atc                 G  s   | j |||S r   )r&   call_repeatedlyrm   r   r   r   rq      s    zHub.call_repeatedlyc                 G  s   |  ||ttB |S r   )rd   r   r   r6   Zfdsre   r    r   r   r   
add_reader   s    zHub.add_readerc                 G  s   |  ||t|S r   )rd   r   rr   r   r   r   
add_writer   s    zHub.add_writerc                 C  sH   || j k}| j |}z| | W 5 |rB|\}}| ||t| X d S r   )r(   getrd   r   rb   )r6   ra   writableZon_writecbr    r   r   r   remove_reader   s    
zHub.remove_readerc                 C  sL   || j k}| j |}z| | W 5 |rF|\}}| ||ttB | X d S r   )r'   ru   rd   r   r   rb   )r6   ra   readableZon_readrw   r    r   r   r   remove_writer   s    
zHub.remove_writerc              
   C  s0   z| j | W n tttfk
r*   Y nX d S r   )r:   r@   AttributeErrorKeyErrorrR   r`   r   r   r   r_      s    zHub._unregisterc              
   C  s0   | j   | j}t | _|W  5 Q R  S Q R X d S r   )r/   r,   r)   )r6   readyr   r   r   
_pop_ready   s    zHub._pop_readyc                   s~    fdd j D   j    fdd jD   j   j      jD ]}|  qT  }|D ]
}|  qnd S )Nc                   s   g | ]}  |qS r   r_   .0ra   r9   r   r   
<listcomp>  s     zHub.close.<locals>.<listcomp>c                   s   g | ]}  |qS r   r   r   r9   r   r   r     s     )r'   clearr(   r2   rB   r+   r~   )r6   r    re   Ztodositemr   r9   r   r<     s    




z	Hub.closec                 C  s4   t |}| j|d  | j|d  | j| d S r   )r   r'   popr(   r2   discardr`   r   r   r   r^     s    zHub._discardc                 C  s   t jd||dd d S )Nz Callback %r raised exception: %rr   rJ   )rT   rU   )r6   re   r\   r   r   r   on_callback_error  s       zHub.on_callback_errorc                  c  s  | j | j }}| jj}| j}| j}| jj}| j}| j	}| j
}|  }|D ]}|rH|  qH|rf||dnd}t| jD ]
}|  qt|s|rg }z||}W n tk
r   Y d S X |pdD ]\}}d}||kr||d kr|| qd  }}||@ r4z|| \}}W n$ |k
r0   | | Y qY nX nd||	@ rvz|| \}}W n$ |k
rr   | | Y qY nX n"||
@ rd}ntt|| d}|rz||p||\}}W n tk
r   Y nX |d kr| | qt||rtz|| W nn tk
r> } z|jtjkr& || W 5 d }~X Y n4 |k
rR   Y n  tk
rp   ||  Y nX qz||  W q |k
r   Y qX q|r|| n|||d d V  q<d S )N)rX   r   r   FTg?)r'   r(   r:   r   r]   rh   r&   rL   r2   r3   r4   r~   r   r*   rc   ru   appendrx   rz   rT   infoW_UNKNOWN_EVENT	TypeErrorrl   rR   rS   EBADFrV   ) r6   	generatorr   rW   rN   r   rk   r|   r   r   r   r'   r(   r   r]   Z
hub_removeZ	scheduledr2   r3   rX   todor   Zpoll_timeoutZtick_callbackZto_consolidateeventsra   eventZgeneral_errorrw   Zcbargsr\   r   r   r   create_loop   s    











zHub.create_loopc                 C  s   ddl m} || S )Nr   )repr_active)debugr   )r6   r   r   r   r   r     s    zHub.repr_activec                 C  s   ddl m} || |pg S )Nr   )repr_events)r   r   )r6   r   r   r   r   r   r     s    zHub.repr_eventsc                 C  s
   t | jS r   )iterr&   r9   r   r   r   rO     s    zHub.schedulerc                 C  s   | j d kr|  | _ | j S r   )r1   r   r9   r   r   r   r%     s    

zHub.loop)N)r   rI   rI   r   )r   F)1r   r   r   r   r   r   r   r+   r7   propertyr:   setterr=   r5   rB   rD   rH   r]   rb   rd   rh   rj   ri   rC   rn   ro   rq   rs   rt   rx   rz   r_   r~   r<   r^   r   r   r   rW   rN   r   rk   r|   r   r   r   r   rO   r%   r   r   r   r   r   9   sj   


  



       
_
r   ),r   
__future__r   rS   r-   
contextlibr   r   queuer   timer   typesr   r   Zviner   r	   Z	kombu.logr
   Zkombu.utils.compatr   Zkombu.utils.eventior   r   r   r   Zkombu.utils.objectsr   r&   r   __all__r   rT   r   __annotations__r   BaseExceptionr   r   r"   r   r   r   r   r   r   r   <module>   s2   
