o
    b                     @   s   U d Z ddlZddlZddlmZ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dZedkrIeZnejZzddlmZ W n eye   eZe	e ed< Y nw eZeeG dd dejeZdd ZdgZdS )z
Select reactor
    N)EBADFEINTR)sleep)Type)implementer)	posixbase)IReactorFDSet)log)platformTypec                 C   sj   | s|s|du rd}nt |d}t| g g g fS |du s!|dkr#d}t| |||\} }}| || g fS )zWin32 select wrapper.Ng{Gz?gMbP?g      ?)minr   select)rwetimeout r   @/usr/lib/python3/dist-packages/twisted/internet/selectreactor.pywin32select   s   

r   win32)_ThreadedWin32EventsMixin
_extraBasec                   @   sl   e Zd ZdZdd Zdd Zdd ZeZdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )SelectReactora-  
    A select() based reactor - runs on all POSIX platforms and on Win32.

    @ivar _reads: A set containing L{FileDescriptor} instances which will be
        checked for read events.

    @ivar _writes: A set containing L{FileDescriptor} instances which will be
        checked for writability.
    c                 C   s    t  | _t  | _tj|  dS )zV
        Initialize file descriptor tracking dictionaries and the base class.
        N)set_reads_writesr   PosixReactorBase__init__selfr   r   r   r   D   s   zSelectReactor.__init__c                 C   s   t d t| j}t| j}| j  | j  | j|f| j|ffD ]<\}}|D ]5}zt|g|g|gd W n  tyX } zt d|  | ||d W Y d }~q)d }~ww |	| q)q#d S )Nz1Malformed file descriptor found.  Preening lists.r   zbad descriptor %sF)
r	   msglistr   r   clearr   	Exception_disconnectSelectableadd)r   readerswritersselSetselList
selectabler   r   r   r   _preenDescriptorsL   s"   




zSelectReactor._preenDescriptorsc              
   C   s4  zt | j| jg |\}}}W n` ty   |   Y dS  ty-   t  |   Y dS  tyn } z6|j	d dv rI| jsH| jsHW Y d}~dS  |j	d t
krWW Y d}~dS |j	d tkri|   W Y d}~dS  d}~ww | j}tj}|d| jf|d| jffD ]\}}	}
|D ]}||
vrq|||||	 qqdS )z
        Run one iteration of the I/O monitor loop.

        This will run all selectables who had input or output readiness
        waiting for them.
        Nr   )r      doReaddoWrite)_selectr   r   
ValueErrorr*   	TypeErrorr	   errOSErrorargsr   r   _doReadOrWritecallWithLogger)r   r   r   r   ignoredse_drdw_logrunselectablesmethodfdsetr)   r   r   r   doSelect\   sB   

zSelectReactor.doSelectc                 C   sV   zt || }W n ty   t d }t  Y nw |r)| |||dk d S d S )N   r,   )getattrBaseExceptionsysexc_infor	   r1   r#   )r   r)   r;   whyr   r   r   r4      s   zSelectReactor._doReadOrWritec                 C      | j | dS )zR
        Add a FileDescriptor for notification of data available to read.
        N)r   r$   r   readerr   r   r   	addReader      zSelectReactor.addReaderc                 C   rD   )zS
        Add a FileDescriptor for notification of data available to write.
        N)r   r$   r   writerr   r   r   	addWriter   rH   zSelectReactor.addWriterc                 C   rD   )zQ
        Remove a Selectable for notification of data available to read.
        N)r   discardrE   r   r   r   removeReader   rH   zSelectReactor.removeReaderc                 C   rD   )zR
        Remove a Selectable for notification of data available to write.
        N)r   rL   rI   r   r   r   removeWriter   rH   zSelectReactor.removeWriterc                 C   s   |  | j| jS N)
_removeAllr   r   r   r   r   r   	removeAll   s   zSelectReactor.removeAllc                 C   
   t | jS rO   )r    r   r   r   r   r   
getReaders      
zSelectReactor.getReadersc                 C   rR   rO   )r    r   r   r   r   r   
getWriters   rT   zSelectReactor.getWritersN)__name__
__module____qualname____doc__r   r*   r=   doIterationr4   rG   rK   rM   rN   rQ   rS   rU   r   r   r   r   r   8   s    
4	r   c                  C   s   t  } ddlm} ||  dS )zDConfigure the twisted mainloop to be run using the select() reactor.r   )installReactorN)r   twisted.internet.mainr[   )reactorr[   r   r   r   install   s   r^   rO   ) rY   r   rA   errnor   r   timer   typingr   zope.interfacer   twisted.internetr   twisted.internet.interfacesr   twisted.pythonr	   twisted.python.runtimer
   r   r.   "twisted.internet.win32eventreactorr   ImportErrorobjectr   __annotations__r   r   r^   __all__r   r   r   r   <module>   s4   
 
