o
    0׾g3                     @   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   W/var/www/html/backend_erp/backend_erp_env/lib/python3.10/site-packages/gevent/select.py_original_select   s   r                      @         selectpollerrorr   )names_to_ignore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)obj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)r5   r4   r7   r6   r   r3   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+   r7   priorityr.   startIOErrorr"   args)clswatchersfd_cbr:   r;   r<   fdlistcallbackr1   r2   exr   r   r   _make_watchersX   s    

zSelectResult._make_watchersc                 C   s(   | D ]
}|   |  q| d d = d S r-   )stopr/   )rB   r2   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   r8   _EV_READ	_EV_WRITErG   waitrI   )
selfrlistwlistrK   rB   readwriter4   add_read	add_writer   r   r   r    o   s   
zSelectResult.selectN)
__name__
__module____qualname__	__slots__staticmethodr8   classmethodrG   rI   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    )rP   rQ   xlistrK   sel_resultseenumberresultr   r   r   r       s&   (c                   @   s    e Zd ZdZdd Zdd ZdS )
PollResult)eventsr4   c                 C   s   t  | _t | _d S r-   )r0   rh   r   r4   rO   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   )	POLLNVALrL   POLLINrM   POLLOUTrh   addr4   r0   )rO   rh   r1   result_flagsr   r   r   	add_event   s   zPollResult.add_eventN)rV   rW   rX   rY   rj   rp   r   r   r   r   rg      s    rg   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-   )fdsr9   r:   ri   r   r   r   rj      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   rL   rM   rl   rm   r+   rq   )rO   r1   	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)rt   )rO   r1   rr   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)pass_events)
r:   r;   r<   r	   rq   r.   r=   r>   rH   r/   )	rO   
watcher_cbrB   r;   r<   r1   rs   r2   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     @@rJ   )	rg   ry   rp   r4   rN   r^   rh   rH   r/   )rO   rK   rf   rB   rx   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+   rq   )rO   r1   r%   r   r   r   
unregisterZ  s   zpoll.unregisterr-   )rV   rW   rX   __doc__rj   r   rt   ru   ry   r!   rz   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_requestr|   r   r   r   _gevent_do_monkey_patchf  s   
r   r-   )5r{   
__future__r   r   r   sysr    
__select__gevent.eventr   
gevent.hubr   r9   r   ra   gevent._compatr   r	   gevent._utilr
   r   r\   r   r   platform
startswithr   rl   POLLPRIrm   POLLERRPOLLHUPrk   
POLLRDNORM
POLLRDBAND
POLLWRNORM
POLLWRBAND__implements__hasattrr.   	__extra____all__r"   globals__imports__rL   rM   r+   objectr,   rg   r!   r   r   r   r   r   <module>   s^   




AD 