U
    c6{iÔ  ã                   @  sH  U d Z ddlm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mZmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ d$dd„Zedkr®eZnejZzddlmZ W n  ek
rä   eZ de!d< Y nX eZ edƒZ"dddddœdd„Z#dddddœdd„Z$eeƒG d d!„ d!ej%e ƒƒZ&d"d#„ Z'd#gZ(dS )%z
Select reactor
é    )ÚannotationsN)ÚEBADFÚEINTR)Úsleep)ÚCallableÚTypeÚTypeVar)Úimplementer)Ú	posixbase)ÚIReactorFDSetÚIReadDescriptorÚIWriteDescriptor)Úlog)ÚplatformTypec                 C  sj   | s2|s2|dkrd}n
t |dƒ}t|ƒ g g g fS |dksB|dkrFd}t | |||¡\} }}| || g fS )zWin32 select wrapper.Ng{®Gáz„?gü©ñÒMbP?g      à?)Úminr   Úselect)ÚrÚwÚeÚtimeout© r   úB/tmp/pip-unpacked-wheel-hfbvu0bz/twisted/internet/selectreactor.pyÚwin32select   s    

r   Úwin32)Ú_ThreadedWin32EventsMixinzType[object]Ú
_extraBaseÚ_Tzlist[_T]zset[_T]z%Callable[[_T, Exception, bool], None]ÚNone)ÚtoPreenÚ	preenIntoÚ
disconnectÚreturnc                 C  sx   |  ¡  | D ]f}zt |g|g|gd¡ W n< tk
rf } zt d| ¡ |||dƒ W 5 d }~X Y qX | |¡ qd S )Nr   zbad descriptor %sF)Úclearr   Ú	Exceptionr   ÚmsgÚadd)r   r   r    Ú
selectabler   r   r   r   Ú	_onePreen:   s    r'   zset[IReadDescriptor]zset[IWriteDescriptor]zECallable[[IReadDescriptor | IWriteDescriptor, Exception, bool], None])ÚreadsÚwritesr    r!   c                 C  s6   t  d¡ t| ƒ}t|ƒ}t|| |ƒ t|||ƒ d S )Nz1Malformed file descriptor found.  Preening lists.)r   r$   Úlistr'   )r(   r)   r    ZreadersZwritersr   r   r   Ú_preenDescriptorsJ   s
    
r+   c                   @  sx   e Zd ZdZddœdd„Zddœ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.
    r   )r!   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   r1   b   s    zSelectReactor.__init__c                 C  s   t | j| j| jƒ d S ©N)r+   r.   r/   Ú_disconnectSelectabler2   r   r   r   r+   j   s    zSelectReactor._preenDescriptorsc              
   C  s@  zt | j| jg |ƒ\}}}W nÄ tk
r:   |  ¡  Y dS  tk
r^   t ¡  |  ¡  Y dS  tk
rà } zf|j	d dkr–| js’| js’W Y ¢FdS ‚ n:|j	d t
kr®W Y ¢*dS |j	d tkrÎ|  ¡  W Y ¢
dS ‚ W 5 d}~X Y nX | j}tj}|d| jf|d| jffD ]4\}}	}
|D ]"}||
k�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   é   ÚdoReadZdoWrite)Ú_selectr.   r/   Ú
ValueErrorr+   Ú	TypeErrorr   ÚerrÚOSErrorÚargsr   r   Ú_doReadOrWriteZcallWithLogger)r3   r   r   r   ZignoredÚseZ_drdwZ_logrunZselectablesÚmethodZfdsetr&   r   r   r   ÚdoSelectm   s:    




þ
zSelectReactor.doSelectc                 C  sT   zt ||ƒƒ }W n( tk
r8   t ¡ d }t ¡  Y nX |rP|  |||dk¡ d S )Né   r7   )ÚgetattrÚBaseExceptionÚsysÚexc_infor   r;   r5   )r3   r&   r@   Úwhyr   r   r   r>   £   s    zSelectReactor._doReadOrWritec                 C  s   | j  |¡ dS )zR
        Add a FileDescriptor for notification of data available to read.
        N)r.   r%   ©r3   Úreaderr   r   r   Ú	addReader¬   s    zSelectReactor.addReaderc                 C  s   | j  |¡ dS )zS
        Add a FileDescriptor for notification of data available to write.
        N)r/   r%   ©r3   Úwriterr   r   r   Ú	addWriter²   s    zSelectReactor.addWriterc                 C  s   | j  |¡ dS )zQ
        Remove a Selectable for notification of data available to read.
        N)r.   ÚdiscardrH   r   r   r   ÚremoveReader¸   s    zSelectReactor.removeReaderc                 C  s   | j  |¡ dS )zR
        Remove a Selectable for notification of data available to write.
        N)r/   rN   rK   r   r   r   ÚremoveWriter¾   s    zSelectReactor.removeWriterc                 C  s   |   | j| j¡S r4   )Z
_removeAllr.   r/   r2   r   r   r   Ú	removeAllÄ   s    zSelectReactor.removeAllc                 C  s
   t | jƒS r4   )r*   r.   r2   r   r   r   Ú
getReadersÇ   s    zSelectReactor.getReadersc                 C  s
   t | jƒS r4   )r*   r/   r2   r   r   r   Ú
getWritersÊ   s    zSelectReactor.getWritersN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r+   rA   ZdoIterationr>   rJ   rM   rO   rP   rQ   rR   rS   r   r   r   r   r,   V   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,   Ztwisted.internet.mainrX   )ZreactorrX   r   r   r   ÚinstallÎ   s    rY   )N))rW   Ú
__future__r   r   rE   Úerrnor   r   Útimer   Útypingr   r   r   Zzope.interfacer	   Ztwisted.internetr
   Ztwisted.internet.interfacesr   r   r   Ztwisted.pythonr   Ztwisted.python.runtimer   r   r8   Z"twisted.internet.win32eventreactorr   ÚImportErrorÚobjectr   Ú__annotations__r   r'   r+   r0   r,   rY   Ú__all__r   r   r   r   Ú<module>   s6   
w