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{®Gáz„?gü©ñÒMbP?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r�qˆ|||||	ƒ qˆq�d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   
ÿ 
