o
    e3                     @   sj  d Z ddlmZmZ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 dd
lmZ ddlmZ ejZejdrRdd ZneZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dgZ%e&edrve%'d ndgZ(dge% Z)ej*Z*eee+ e)ddZ,dZ-dZ.dd Z/G dd  d e0Z1d'd!dZG d"d# d#e0Z2G d$d de0Z3d%d& Z4dS )(z
Waiting for I/O completion.
    )absolute_importdivisionprint_functionN)Event)_get_hub_noargs)sleep)integer_types)	iteritems)copy_globals)_NONE)EINTRwin32c                 C   s   | s|s|sdS t | |||S )N r   r   )_real_original_select)rwxtr   r   =D:\Projects\ConvertPro\env\Lib\site-packages\gevent/select.py_original_select   s   r                      @         selectpollerrorr   )Znames_to_ignoreZdunder_names_to_keepc                 C   s>   z| j }W | S  ty   t| tstd| f |  Y S w )Nz6argument must be an int, or have a fileno() method: %r)filenoAttributeError
isinstancer   	TypeError)objZfileno_fr   r   r   
get_filenoB   s   
r(   c                   @   s<   e Zd ZdZedd Zedd Zedd Zdd	 Z	d
S )SelectResultr   c                    s    fdd}||_ |S )Nc                    s    |  |     d S N)appendcloseset)fdwatchereventready_collectionr   r   cbQ   s   
z'SelectResult._make_callback.<locals>.cb)mask)r2   r1   r4   r3   r   r0   r   _make_callbackO   s   zSelectResult._make_callbackc                 G   s   t  j}|j}|j}|D ]3\}}z|D ]}|t||j}	||	_||	 |	|||	 qW q t	y? }
 zt
|
j d }
~
ww d S r*   )get_hubloopioMAXPRIr(   r4   priorityr+   startIOErrorr"   args)clswatchersZfd_cbr7   r8   r9   Zfdlistcallbackr.   r/   exr   r   r   _make_watchersX   s    

zSelectResult._make_watchersc                 C   s(   | D ]
}|   |  q| d d = d S r*   )stopr,   )r?   r/   r   r   r   	_closeallh   s   
zSelectResult._closeallc           
   	   C   st   g }g }g }t  }| ||t}| ||t}	z| |||f||	f |j|d ||g fW | | S | | w )Ntimeout)r   r5   _EV_READ	_EV_WRITErB   waitrD   )
selfrlistwlistrF   r?   readwriter1   Zadd_readZ	add_writer   r   r   r    o   s   
zSelectResult.selectN)
__name__
__module____qualname__	__slots__staticmethodr5   classmethodrB   rD   r    r   r   r   r   r)   L   s    


r)   c              
   C   s   |dur|dk rt dt| ttfr| nt| } t|ttfr"|nt|}d}z	t| ||d}W n" tyS } zt|ddpC|jd }|tkrI W Y d}~nd}~ww |d sh|d sh|d sh|durm|dkrmt	  |S t
 }|| ||S )a  An implementation of :obj:`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-negativer   errnor   r   )
ValueErrorr%   listtupler   r"   getattrr=   r   _g_sleepr)   r    )rK   rL   ZxlistrF   Zsel_resultseZenumberresultr   r   r   r       s&   (c                   @   s    e Zd ZdZdd Zdd ZdS )
PollResult)eventsr1   c                 C   s   t  | _t | _d S r*   )r-   r^   r   r1   rJ   r   r   r   __init__   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   )	POLLNVALrG   POLLINrH   POLLOUTr^   addr1   r-   )rJ   r^   r.   Zresult_flagsr   r   r   	add_event   s   zPollResult.add_eventN)rO   rP   rQ   rR   r`   re   r   r   r   r   r]      s    r]   c                   @   sF   e Zd ZdZdd ZefddZdd Zdd	 ZdddZ	dd Z
d
S )r!   a  
    An implementation of :obj:`select.poll` that blocks only the current greenlet.

    With only one exception, the interface is the same as the standard library interface.

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

    .. versionadded:: 1.1b1
    .. versionchanged:: 1.5
       This is now always defined, regardless of whether the standard library
       defines :func:`select.poll` or not. Note that it may have different performance
       characteristics.
    c                 C   s   i | _ t j| _d S r*   )fdsr6   r7   r_   r   r   r   r`      s   zpoll.__init__c                 C   sH   |t u r	ttB }nd}|t@ rt}|t@ r|tO }t|}|| j|< dS )a  
        Register a file descriptor *fd* with the polling object.

        Future calls to the :meth:`poll`` method will then check
        whether the file descriptor has any pending I/O events. *fd* can
        be either an integer, or an object with a ``fileno()`` method that
        returns an integer. File objects implement ``fileno()``, so they
        can also be used as the argument (but remember that regular
        files are usually always ready).

        *eventmask* is an optional bitmask describing the type of events
        you want to check for, and can be a combination of the
        constants ``POLLIN``, and ``POLLOUT`` (``POLLPRI`` is not supported).
        r   N)r   rG   rH   rb   rc   r(   rf   )rJ   r.   	eventmaskflagsr#   r   r   r   register   s   
zpoll.registerc                 C   s   |  || dS )zA
        Change the set of events being watched on *fd*.
        N)ri   )rJ   r.   rg   r   r   r   modify  s   zpoll.modifyc           	      C   s|   g }| j j}| j j}z"t| jD ]\}}|||}|| ||_|j||dd qW |S    |D ]
}|  |	  q2 )NT)Zpass_events)
r7   r8   r9   r	   rf   r+   r:   r;   rC   r,   )	rJ   Z
watcher_cbr?   r8   r9   r.   rh   r/   awatcherr   r   r   _get_started_watchers  s    



zpoll._get_started_watchersNc              	   C   s   t  }| |j}z+|dur|dk rd}n|r|d }|jj|d t|jW |D ]
}|  |  q)S |D ]
}|  |  q7w )aH  
        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.
        Nr   g     @@rE   )	r]   rl   re   r1   rI   rW   r^   rC   r,   )rJ   rF   r\   r?   rk   r   r   r   r!   1  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(   rf   )rJ   r.   r#   r   r   r   
unregisterZ  s   zpoll.unregisterr*   )rO   rP   rQ   __doc__r`   r   ri   rj   rl   r!   rm   r   r   r   r   r!      s    
)c                 C   s.   | j d }|   |r| dddd d S d S )N
aggressiveZepollZkqueueZkeventZdevpoll)Zpatch_kwargsZdefault_patch_itemsZremove_item)Zpatch_requestro   r   r   r   _gevent_do_monkey_patchf  s   
rp   r*   )5rn   
__future__r   r   r   sysr    Z
__select__Zgevent.eventr   Z
gevent.hubr   r6   r   rZ   Zgevent._compatr   r	   Zgevent._utilr
   r   rU   r   r   platform
startswithr   rb   ZPOLLPRIrc   ZPOLLERRZPOLLHUPra   Z
POLLRDNORMZ
POLLRDBANDZ
POLLWRNORMZ
POLLWRBANDZ__implements__hasattrr+   Z	__extra____all__r"   globalsZ__imports__rG   rH   r(   objectr)   r]   r!   rp   r   r   r   r   <module>   s^   




AD 