o
    U˟i5                     @   sR  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 ejZejd
rFd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rje"$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e-Z.d%ddZG d d! d!e-Z/G d"d de-Z0d#d$ Z1dS )&z
Waiting for I/O completion.
    )absolute_importdivisionprint_functionN)Event)_get_hub_noargs)sleep)copy_globals)_NONE)EBADFwin32c                 C   s   | s|s|sdS t | |||S )N) r   r   )_real_original_select)rwxtr   r   U/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/select.py_original_select   s   r                      @         selectpollerrorr   )names_to_ignoredunder_names_to_keepc              
   C   s`   t | tr| }nzt|  }W n tttfy"   td| d w |dk r.td||S )NzInvalid file object: {!r}r   zInvalid file descriptor: {})
isinstanceintfilenoAttributeError	TypeError
ValueErrorformat)fileobjfdr   r   r   
get_filenoE   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)r*   watchereventready_collectionr   r   cbX   s   
z'SelectResult._make_callback.<locals>.cb)mask)r4   r3   r6   r5   r   r2   r   _make_callbackV   s   zSelectResult._make_callbackc           
      G   s^   t  j}|j}|j}|D ] \}}|D ]}|t||j}	||	_||	 |	|||	 qqd S r-   )	get_hubloopioMAXPRIr+   r6   priorityr.   start)
clswatchersfd_cbr9   r:   r;   fdlistcallbackr*   r1   r   r   r   _make_watchers_   s   
zSelectResult._make_watchersc                 C   s(   | D ]
}|   |  q| d d = d S r-   )stopr/   )r?   r1   r   r   r   	_closealll   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   r7   _EV_READ	_EV_WRITErC   waitrE   )
selfrlistwlistrG   r?   readwriter3   add_read	add_writer   r   r   r   s   s   
zSelectResult.selectN)
__name__
__module____qualname__	__slots__staticmethodr7   classmethodrC   rE   r   r   r   r   r   r,   S   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|}t| ||d}|d sA|d sA|d sA|durF|dkrFt  |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   r   )r'   r"   listtupler   _g_sleepr,   r   )rL   rM   xlistrG   sel_resultsresultr   r   r   r      s   (c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
PollResult)eventsr3   c                 C   s   t  | _t | _d S r-   )r0   r_   r   r3   rK   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   )	POLLNVALrH   POLLINrI   POLLOUTr_   addr3   r0   )rK   r_   r*   result_flagsr   r   r   	add_event   s   zPollResult.add_eventc                 C   s   | j |tf d S r-   )r_   re   rb   )rK   r*   r   r   r   add_error_before_io   s   zPollResult.add_error_before_ioN)rR   rS   rT   rU   ra   rg   rh   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-   )fdsr8   r9   r`   r   r   r   ra      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	   rH   rI   rc   rd   r+   ri   )rK   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)rl   )rK   r*   rj   r   r   r   modify  s   zpoll.modifyc                 C   s   g }| j j}| j j}|j}zB| j D ]9\}}z|||}W n ty; }	 z|	jtkr, |	| W Y d }	~	qd }	~	ww |
| ||_|j||dd qW |S    |D ]
}
|
  |
  qU )NT)pass_events)r9   r:   r;   rg   ri   itemsOSErrorerrnor
   rh   r.   r<   r=   rD   r/   )rK   poll_resultr?   r:   r;   
watcher_cbr*   rk   r1   exawatcherr   r   r   _get_started_watchers   s2   



zpoll._get_started_watchersNc              	   C   s   t  }| |}z+|dur|dk rd}n|r|d }|jj|d t|jW |D ]
}|  |  q(S |D ]
}|  |  q6w )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     @@rF   )r^   rv   r3   rJ   rX   r_   rD   r/   )rK   rG   r]   r?   ru   r   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+   ri   )rK   r*   r$   r   r   r   
unregisterc  s   zpoll.unregisterr-   )rR   rS   rT   __doc__ra   r	   rl   rm   rv   r   rw   r   r   r   r   r      s    
)c                 C   s.   | j d }|   |r| dddd d S d S )N
aggressiveepollkqueuekeventdevpoll)patch_kwargsdefault_patch_itemsremove_item)patch_requestry   r   r   r   _gevent_do_monkey_patcho  s   
r   r-   )2rx   
__future__r   r   r   sysr   
__select__gevent.eventr   
gevent.hubr   r8   r   rZ   gevent._utilr   r	   rq   r
   r   platform
startswithr   rc   POLLPRIrd   POLLERRPOLLHUPrb   
POLLRDNORM
POLLRDBAND
POLLWRNORM
POLLWRBAND__implements__hasattrr.   	__extra____all__r   globals__imports__rH   rI   r+   objectr,   r^   r   r   r   r   r   r   <module>   sZ   



>> 	