3
Z_ð]ç  ã               @   s¢   d dl Z d dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
 yd dlZW n ek
rd   dZY nX dd„ ZG dd„ deƒZG dd	„ d	eƒZd
d„ Zdd„ ZdS )é    N)Ú	greenlets)ÚBaseHubÚREADÚWRITEc               C   s   t d k	S )N)Úevent© r   r   ú9/tmp/pip-build-yz_zf6az/eventlet/eventlet/hubs/pyevent.pyÚis_available   s    r	   c               @   s:   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZdS )Úevent_wrapperNc             C   s   || _ || _d S )N)ÚimplÚseconds)Úselfr   r   r   r   r   Ú__init__   s    zevent_wrapper.__init__c             C   s"   | j d k	rt| j ƒS tj| ƒS d S )N)r   ÚreprÚobjectÚ__repr__)r   r   r   r   r      s    

zevent_wrapper.__repr__c             C   s"   | j d k	rt| j ƒS tj| ƒS d S )N)r   Ústrr   Ú__str__)r   r   r   r   r      s    

zevent_wrapper.__str__c             C   s   | j d k	r| j jƒ  d | _ d S )N)r   Údelete)r   r   r   r   Úcancel%   s    

zevent_wrapper.cancelc             C   s   t | jo| jjƒ ƒS )N)Úboolr   Úpending)r   r   r   r   r   *   s    zevent_wrapper.pending)NN)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   Úpropertyr   r   r   r   r   r
      s
   
r
   c                   sœ   e Zd ZeefZ‡ fdd„Zdd„ Zdd„ Zddd	„Z	d
d„ Z
dd„ Zee
eƒZ‡ fdd„Zdd„ Z‡ fdd„Zdd„ Zdd„ ZeZdd„ Zdd„ Z‡  ZS )ÚHubc                s:   t tˆ ƒjƒ  tjƒ  d ˆ _ˆ jd‡ fdd„ƒ g ˆ _d S )Né   c                s   ˆ j jjtƒS )N)ÚgreenletÚparentÚthrowÚKeyboardInterrupt)Ú	signalnumÚframe)r   r   r   Ú<lambda>:   s    zHub.__init__.<locals>.<lambda>)Úsuperr   r   r   ÚinitÚsignal_exc_infoÚsignalÚevents_to_add)r   )Ú	__class__)r   r   r   3   s    zHub.__init__c             C   sº   t j}x®x>| jD ]4}|d k	r|jd k	r|jd k	r|jj|jƒ d |_qW g | _|ƒ }tt dd ƒd k	r¦tt dƒ}tt dd ƒ tt dƒd ksŒt‚t	j
|d |d |d ƒ |dkr|S qW d S )NZ__event_excr   é   r   )r   Úloopr)   r   r   ÚaddÚgetattrÚsetattrÚAssertionErrorÚsixÚreraise)r   r,   ÚeÚresultÚtr   r   r   Údispatch=   s    

zHub.dispatchc             C   sŽ   xˆy| j ƒ  W q tjk
r&   P Y q | jk
r<   ‚ Y q   | jd k	rp| jdtjƒ jjf| jžŽ  d | _n| j	d t
jƒ ƒ Y qX qW d S )Nr   )r6   r   ÚGreenletExitÚSYSTEM_EXCEPTIONSr'   Úschedule_call_globalÚ
getcurrentr   r    Zsquelch_timer_exceptionÚsysÚexc_info)r   r   r   r   ÚrunQ   s    
zHub.runTc             C   s:   | j d| jjtjƒ |r6| jtjƒ k	s.tdƒ‚| jƒ  d S )Nr   z5Can't abort with wait from inside the hub's greenlet.)r9   r   r    r7   r:   r0   Úswitch)r   Úwaitr   r   r   Úaborta   s
    z	Hub.abortc             C   s
   t | jƒS )N)r   r   )r   r   r   r   Ú_getrunningh   s    zHub._getrunningc             C   s   d S )Nr   )r   Úvaluer   r   r   Ú_setrunningk   s    zHub._setrunningc                sd   t ˆ tjƒr‡ fdd„}nˆ }|tkr6tj|||ƒ}n|tkrLtj|||ƒ}tt	| ƒj
|||||ƒS )Nc                s   ˆ | ƒ d S )Nr   )Z_d)Úreal_cbr   r   Úcbs   s    zHub.add.<locals>.cb)Ú
isinstanceÚtypesÚBuiltinMethodTyper   r   Úreadr   Úwriter%   r   r-   )r   ÚevtypeÚfilenorD   Zreal_tbÚmacrE   Zevt)r*   )rD   r   r-   o   s    zHub.addc                s    ‡ ‡‡fdd„}t tjˆ|ƒƒS )Nc            	      s2   yˆ ˆd ƒ W n   t jƒ ˆ_tjƒ  Y nX d S )N)r;   r<   r'   r   r@   r   )Úhandlerr   r"   r   r   Úwrapper€   s
    
zHub.signal.<locals>.wrapper)r
   r   r(   )r   r"   rN   rO   r   )rN   r   r"   r   r(      s    z
Hub.signalc                s   t t| ƒj|ƒ |jjƒ  d S )N)r%   r   ÚremoverE   r   )r   Úlistener)r*   r   r   rP   ˆ   s    z
Hub.removec             C   sd   x^t j| jƒD ]N}|j|d ƒ}|ry|jjƒ  W q | jk
rH   ‚ Y q   tjƒ  Y qX qW d S )N)	r1   Ú
itervaluesZ	listenersÚpoprE   r   r8   Ú	tracebackÚ	print_exc)r   rL   Z
lcontainerrQ   r   r   r   Úremove_descriptorŒ   s    zHub.remove_descriptorc             O   sV   t jƒ }|| j kr&| j||f|ž|ŽS tjt||||fƒ}t||d�}| jj|ƒ |S )N)r   )r   r:   r9   r   Ú_scheduled_call_localr
   r)   Úappend)r   r   rE   ÚargsÚkwargsÚcurrentÚ
event_implrO   r   r   r   Úschedule_call_local—   s    
zHub.schedule_call_localc             O   s.   t j t|||fƒ}t||d�}| jj|ƒ |S )N)r   )r   Ú_scheduled_callr
   r)   rX   )r   r   rE   rY   rZ   r\   rO   r   r   r   r9   ¢   s    zHub.schedule_call_globalc             C   s
   t j}|S )N)r   Ú__version__)r   Zbaseversionr   r   r   Ú_version_info¨   s    zHub._version_info)T)r   r   r   r!   Ú
SystemExitr8   r   r6   r=   r@   rA   rC   r   Zrunningr-   r(   rP   rV   r]   Zschedule_callr9   r`   Ú__classcell__r   r   )r*   r   r   /   s    


		r   c          
   C   s(   |\}}}z|||Ž W d | j ƒ  X d S )N)r   )r\   ÚhandlerK   ÚargrE   rY   rZ   r   r   r   r^   ­   s    
r^   c          
   C   s0   |\}}}}z|j s|||Ž W d | jƒ  X d S )N)Zdeadr   )r\   rc   rK   rd   rE   rY   rZ   Zcaller_greenletr   r   r   rW   µ   s
    rW   )r;   rT   rG   Zeventlet.supportr   r   r1   Zeventlet.hubs.hubr   r   r   r   ÚImportErrorr	   r   r
   r   r^   rW   r   r   r   r   Ú<module>   s   
~