3
Z_ð]Ú  ã               @   sf   d dl Z d dlZd dlmZmZ d dlmZ d dlZejdƒZ	ejdƒZ
dd„ ZG dd	„ d	ejƒZdS )
é    N)ÚpatcherÚsupport)ÚhubÚselectÚtimec               C   s
   t tdƒS )NÚkqueue)Úhasattrr   © r	   r	   ú8/tmp/pip-build-yz_zf6az/eventlet/eventlet/hubs/kqueue.pyÚis_available
   s    r   c                   sp   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡ fdd„Zdd„ Z	‡ fdd„Z
‡ fdd„Zddd„Z‡  ZS )ÚHubéd   Nc                s8   t jtjt jtji| _tt| ƒj	|ƒ i | _
| jƒ  d S )N)r   ÚREADr   ÚKQ_FILTER_READÚWRITEÚKQ_FILTER_WRITEÚFILTERSÚsuperr   Ú__init__Ú_eventsÚ_init_kqueue)ÚselfÚclock)Ú	__class__r	   r
   r      s
    zHub.__init__c             C   s   t jƒ | _tjƒ | _d S )N)r   r   ÚosÚgetpidÚ_pid)r   r	   r	   r
   r      s    
zHub._init_kqueuec             C   s<   | j jƒ  | jƒ  dd„ tj| jƒD ƒ}| j j|ddƒ d S )Nc             S   s    g | ]}t j|ƒD ]}|‘qqS r	   )ÚsixÚ
itervalues)Ú.0ÚiÚer	   r	   r
   ú
<listcomp>!   s    z&Hub._reinit_kqueue.<locals>.<listcomp>r   )r   Úcloser   r   r   r   Úcontrol)r   Úeventsr	   r	   r
   Ú_reinit_kqueue   s    
zHub._reinit_kqueuec             C   sV   y| j j|||ƒS  ttfk
rP   tjƒ | jkrJ| jƒ  | j j|||ƒS ‚ Y nX d S )N)r   r$   ÚOSErrorÚIOErrorr   r   r   r&   )r   r%   Ú
max_eventsÚtimeoutr	   r	   r
   Ú_control%   s    zHub._controlc       	         sŽ   t t| ƒj|||||ƒ}| jj|i ƒ}||krŠy4tj|| jj|ƒtj	ƒ}| j
|gddƒ |||< W n& tk
rˆ   t t| ƒj|ƒ ‚ Y nX |S )Nr   )r   r   Úaddr   Ú
setdefaultr   Úkeventr   ÚgetZ	KQ_EV_ADDr+   Ú
ValueErrorÚremove)	r   ÚevtypeÚfilenoÚcbÚtbÚmacÚlistenerr%   Úevent)r   r	   r
   r,   /   s    zHub.addc             C   s    dd„ |D ƒ}| j |ddƒ d S )Nc             S   s    g | ]}t j|j|jt jƒ‘qS r	   )r   r.   ÚidentÚfilterZKQ_EV_DELETE)r   r!   r	   r	   r
   r"   >   s   z&Hub._delete_events.<locals>.<listcomp>r   )r+   )r   r%   Z
del_eventsr	   r	   r
   Ú_delete_events<   s    zHub._delete_eventsc                st   t t| ƒj|ƒ |j}|j}| j| j|ƒsp| j| j|d ƒ}|d krJd S y| j	|fƒ W n t
k
rn   Y nX d S )N)r   r   r1   r2   r3   Ú	listenersr/   r   Úpopr;   r'   )r   r7   r2   r3   r8   )r   r	   r
   r1   C   s    z
Hub.removec                sZ   t t| ƒj|ƒ y| jj|ƒjƒ }| j|ƒ W n& tk
rB   Y n tk
rT   Y nX d S )N)	r   r   Úremove_descriptorr   r=   Úvaluesr;   ÚKeyErrorr'   )r   r3   r%   )r   r	   r
   r>   P   s    zHub.remove_descriptorc       	      C   sä   | j | j }| j | j }| r6| r6|r2tj|ƒ d S | jg | j|ƒ}| j}x’|D ]Š}|j}|j	}y@|t
jkr‚|j|tjƒj|ƒ |t
jkr |j|tjƒj|ƒ W qR |k
r¸   ‚ Y qR   | j|tjƒ ƒ tjƒ  Y qRX qRW d S )N)r<   r   r   r   Úsleepr+   Ú
MAX_EVENTSÚSYSTEM_EXCEPTIONSr9   r:   r   r   r/   r   Znoopr4   r   Zsquelch_exceptionÚsysÚexc_infor   Zclear_sys_exc_info)	r   ÚsecondsZreadersZwritersÚresultrC   r8   r3   Zevfiltr	   r	   r
   ÚwaitZ   s*    



zHub.wait)N)N)Ú__name__Ú
__module__Ú__qualname__rB   r   r   r&   r+   r,   r;   r1   r>   rH   Ú__classcell__r	   r	   )r   r
   r      s   	

r   )r   rD   Zeventletr   r   Zeventlet.hubsr   r   Úoriginalr   r   r   ZBaseHubr   r	   r	   r	   r
   Ú<module>   s   

