B
    H/\'                 @   sv  d Z ddlmZmZm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 dd
lmZ ddlmZ ddlmZ ejdrdd ZneZy,ddlmZ ddlmZmZmZ ddgZW n e k
r   dZdgZY nX dge Z!ddlZ"e"j#Z#ee"e$ e!ddZ%dZ&dZ'dd Z(G dd de)Z*d!ddZedk	rpG dd de)Z+G d d de)Z[dS )"z
Waiting for I/O completion.
    )absolute_importdivisionprint_functionN)Event)_get_hub_noargs)sleep)integer_types)	iteritems)copy_globals)_NONE)EINTR)selectZwin32c             C   s   | s|s|sdS t | |||S )N) r   r   )_real_original_select)rwxtr   r   ,lib/python3.7/site-packages/gevent/select.py_original_select   s    r   )poll)POLLINPOLLOUTPOLLNVALr   r   errorr   )Znames_to_ignoreZdunder_names_to_keep      c             C   sB   y
| j }W n, tk
r6   t| ts2td| f | S X | S d S )Nz6argument must be an int, or have a fileno() method: %r)filenoAttributeError
isinstancer   	TypeError)objZfileno_fr   r   r   
get_fileno3   s    

r"   c               @   sT   e Zd ZdZdd Zdd Zee_dd Ze	e_dd	 Z
d
d Zdd Zdd ZdS )SelectResult)readwriteeventc             C   s   g | _ g | _t | _d S )N)r$   r%   r   r&   )selfr   r   r   __init__A   s    zSelectResult.__init__c             C   s   | j | | j  d S )N)r$   appendr&   set)r'   socketr   r   r   add_readF   s    zSelectResult.add_readc             C   s   | j | | j  d S )N)r%   r)   r&   r*   )r'   r+   r   r   r   	add_writeL   s    zSelectResult.add_writec             C   s>   x8|D ]0}|t ||j}||_|| ||| qW d S )N)r"   r&   priorityr)   start)r'   watchersZfdlistcallbackioZprifdwatcherr   r   r   Z__add_watchersR   s
    

zSelectResult.__add_watchersc          
   C   sr   t  j}|j}|j}y,| ||| j|| | ||| j|| W n, tk
rl } zt|j	 W d d }~X Y nX d S )N)
get_hubloopr2   MAXPRI_SelectResult__add_watchersr,   r-   IOErrorr   args)r'   r0   rlistwlistr6   r2   r7   exr   r   r   _make_watchersY   s    zSelectResult._make_watchersc             C   s,   x|D ]}|   |  qW |d d = d S )N)stopclose)r'   r0   r4   r   r   r   	_closealld   s    
zSelectResult._closeallc          	   C   s@   g }z*|  ||| | jj|d | j| jg fS | | X d S )N)timeout)r>   r&   waitr$   r%   rA   )r'   r;   r<   rB   r0   r   r   r   r   j   s    zSelectResult.selectN)__name__
__module____qualname__	__slots__r(   r,   _EV_READr&   r-   	_EV_WRITEr8   r>   rA   r   r   r   r   r   r#   >   s   r#   c          
   C   s   |dk	r|dk rt dd}yt| ||d}W nB tk
rp } z$t|ddpT|jd }|tkr` W dd}~X Y nX |d s|d s|d s|dk	r|dkrt  |S t }|| ||S )a  An implementation of :meth:`select.select` that blocks only the current greenlet.

    .. caution:: *xlist* is ignored.

    .. versionchanged:: 1.2a1
       Raise a :exc:`ValueError` if timeout is negative. This matches Python 3's
       behaviour (Python 2 would raise a ``select.error``). Previously gevent had
       undefined behaviour.
    .. versionchanged:: 1.2a1
       Raise an exception if any of the file descriptors are invalid.
    Nr   ztimeout must be non-negative)r   r   r   errnor   r   )	
ValueErrorr   r   getattrr:   r   _g_sleepr#   r   )r;   r<   ZxlistrB   Zsel_resultseZenumberresultr   r   r   r   t   s    (c               @   s    e Zd ZdZdd Zdd ZdS )
PollResult)eventsr&   c             C   s   t  | _t | _d S )N)r*   rQ   r   r&   )r'   r   r   r   r(      s    zPollResult.__init__c             C   sL   |dk rt }n d}|t@ rt}|t@ r.|tO }| j||f | j  d S )Nr   )	r   rH   r   rI   r   rQ   addr&   r*   )r'   rQ   r3   Zresult_flagsr   r   r   	add_event   s    zPollResult.add_eventN)rD   rE   rF   rG   r(   rS   r   r   r   r   rP      s   rP   c               @   s>   e Zd ZdZdd ZefddZdd Zdd	d
Zdd Z	dS )r   z
        An implementation of :class:`select.poll` that blocks only the current greenlet.

        .. caution:: ``POLLPRI`` data is not supported.

        .. versionadded:: 1.1b1
        c             C   s   i | _ t j| _d S )N)fdsr5   r6   )r'   r   r   r   r(      s    zpoll.__init__c             C   sH   |t krttB }n d}|t@ r"t}|t@ r2|tO }t|}|| j|< d S )Nr   )r   rH   rI   r   r   r"   rT   )r'   r3   	eventmaskflagsr   r   r   r   register   s    
zpoll.registerc             C   s   |  || d S )N)rW   )r'   r3   rU   r   r   r   modify   s    zpoll.modifyNc       
   	   C   s   t  }g }| jj}| jj}z~xBt| jD ]4\}}|||}|| ||_|j|j	|dd q(W |dk	r|dk rvd}n|r|d }|j
j|d t|jS x|D ]}	|	  |	  qW X dS )ad  
            poll the registered fds.

            .. versionchanged:: 1.2a1
               File descriptors that are closed are reported with POLLNVAL.

            .. versionchanged:: 1.3a2
               Under libuv, interpret *timeout* values less than 0 the same as *None*,
               i.e., block. This was always the case with libev.
            T)Zpass_eventsNr   g     @@)rB   )rP   r6   r2   r7   r	   rT   r)   r.   r/   rS   r&   rC   listrQ   r?   r@   )
r'   rB   rO   r0   r2   r7   r3   rV   r4   Zawatcherr   r   r   r      s(    



z	poll.pollc             C   s   t |}| j|= dS )z
            Unregister the *fd*.

            .. versionchanged:: 1.2a1
               Raise a `KeyError` if *fd* was not registered, like the standard
               library. Previously gevent did nothing.
            N)r"   rT   )r'   r3   r   r   r   r   
unregister  s    zpoll.unregister)N)
rD   rE   rF   __doc__r(   r   rW   rX   r   rZ   r   r   r   r   r      s   
0)N),r[   Z
__future__r   r   r   sysZgevent.eventr   Z
gevent.hubr   r5   r   rM   Zgevent._compatr   r	   Zgevent._utilr
   r   rJ   r   r   r   platform
startswithr   r   Zoriginal_pollr   r   r   Z__implements__ImportError__all__Z
__select__r   globalsZ__imports__rH   rI   r"   objectr#   rP   r   r   r   r   <module>   sH   

6
8
]