o
    Òó·iÔ  ã                   @  s2  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rWeZnejZzddlmZ W n eyq   eZ de!d< Y nw eZ edƒZ"d)dd„Z#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   | 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   údC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/selectreactor.pyÚwin32select   s   

r   Úwin32)Ú_ThreadedWin32EventsMixinzType[object]Ú
_extraBaseÚ_TÚtoPreenúlist[_T]Ú	preenIntoúset[_T]Ú
disconnectú%Callable[[_T, Exception, bool], None]ÚreturnÚNonec                 C  sz   |  ¡  | D ]4}zt |g|g|gd¡ W n ty4 } zt d| ¡ |||dƒ W Y d }~qd }~ww | |¡ qd S )Nr   zbad descriptor %sF)Úclearr   Ú	Exceptionr   ÚmsgÚadd)r   r   r!   Ú
selectabler   r   r   r   Ú	_onePreen:   s   €þùr*   Úreadsúset[IReadDescriptor]Úwritesúset[IWriteDescriptor]úECallable[[IReadDescriptor | IWriteDescriptor, Exception, bool], None]c                 C  s6   t  d¡ t| ƒ}t|ƒ}t|| |ƒ t|||ƒ d S )Nz1Malformed file descriptor found.  Preening lists.)r   r'   Úlistr*   )r+   r-   r!   ÚreadersZwritersr   r   r   Ú_preenDescriptorsJ   s
   
r2   c                   @  sp   e Zd ZdZddd„Z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   r8   b   s   zSelectReactor.__init__c                 C  s   t | j| j| jƒ d S ©N)r2   r5   r6   Ú_disconnectSelectabler9   r   r   r   r2   j   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   é   ÚdoReadZdoWrite)Ú_selectr5   r6   Ú
ValueErrorr2   Ú	TypeErrorr   ÚerrÚOSErrorÚargsr   r   Ú_doReadOrWriteZcallWithLogger)r:   r   r   r   ZignoredÚseZ_drdwZ_logrunZselectablesÚmethodZfdsetr)   r   r   r   ÚdoSelectm   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   rB   r<   )r:   r)   rG   Úwhyr   r   r   rE   £   s   þÿzSelectReactor._doReadOrWritec                 C  ó   | j  |¡ dS )zR
        Add a FileDescriptor for notification of data available to read.
        N)r5   r(   ©r:   Úreaderr   r   r   Ú	addReader¬   ó   zSelectReactor.addReaderc                 C  rO   )zS
        Add a FileDescriptor for notification of data available to write.
        N)r6   r(   ©r:   Úwriterr   r   r   Ú	addWriter²   rS   zSelectReactor.addWriterc                 C  rO   )zQ
        Remove a Selectable for notification of data available to read.
        N)r5   ÚdiscardrP   r   r   r   ÚremoveReader¸   rS   zSelectReactor.removeReaderc                 C  rO   )zR
        Remove a Selectable for notification of data available to write.
        N)r6   rW   rT   r   r   r   ÚremoveWriter¾   rS   zSelectReactor.removeWriterc                 C  s   |   | j| j¡S r;   )Z
_removeAllr5   r6   r9   r   r   r   Ú	removeAllÄ   s   zSelectReactor.removeAllc                 C  ó
   t | jƒS r;   )r0   r5   r9   r   r   r   Ú
getReadersÇ   ó   
zSelectReactor.getReadersc                 C  r[   r;   )r0   r6   r9   r   r   r   Ú
getWritersÊ   r]   zSelectReactor.getWritersN)r#   r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   r2   rH   ZdoIterationrE   rR   rV   rX   rY   rZ   r\   r^   r   r   r   r   r3   V   s    


4	r3   c                  C  s   t ƒ } ddlm} || ƒ dS )zDConfigure the twisted mainloop to be run using the select() reactor.r   )ÚinstallReactorN)r3   Ztwisted.internet.mainrc   )Zreactorrc   r   r   r   ÚinstallÎ   s   rd   r;   )r   r   r   r    r!   r"   r#   r$   )r+   r,   r-   r.   r!   r/   r#   r$   ))rb   Ú
__future__r   r   rL   Ú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   r?   Z"twisted.internet.win32eventreactorr   ÚImportErrorÚobjectr   Ú__annotations__r   r*   r2   r7   r3   rd   Ú__all__r   r   r   r   Ú<module>   s:   
ÿ

w
