U
    W[G                     @   s   d Z ddlmZmZ ddlmZ ddl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dZedkreZnejZzddlmZ W n ek
r   eZY nX eZeeG dd dejeZdd ZdgZ dS )z
Select reactor
    )divisionabsolute_import)sleepN)EINTREBADF)implementer)IReactorFDSet)	posixbase)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{Gz?gMbP?g      ?)minr   select)rwetimeout r   @/usr/lib/python3/dist-packages/twisted/internet/selectreactor.pywin32select   s    

r   Zwin32)_ThreadedWin32EventsMixinc                   @   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   B   s    zSelectReactor.__init__c                 C   s   t d t| j}t| j}| j  | j  | j|f| j|ffD ]v\}}|D ]h}zt|g|g|gd W n> tk
r } z t d|  | ||d W 5 d }~X Y qRX |	| qRqFd S )Nz1Malformed file descriptor found.  Preening lists.r   zbad descriptor %sF)
r
   msglistr   r   clearr   	Exception_disconnectSelectableadd)r   ZreadersZwritersZselSetZselList
selectabler   r   r   r   _preenDescriptorsK   s    




 zSelectReactor._preenDescriptorsc              
   C   sJ  zt | j| jg |\}}}W n tk
r:   |   Y dS  tk
r^   t  |   Y dS  tj	t
j	tfk
r } zf|jd dkr| js| jsW Y FdS  n:|jd tkrW 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r0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
   errr   errorsocketIOErrorargsr   r   _doReadOrWriteZcallWithLogger)r   r   r   r   ZignoredZseZ_drdwZ_logrunZselectablesmethodZfdsetr$   r   r   r   doSelect]   sB     





zSelectReactor.doSelectc                 C   sL   zt || }W n    t d }t  Y nX |rH| |||dk d S )N   r'   )getattrsysexc_infor
   r+   r"   )r   r$   r1   Zwhyr   r   r   r0      s    zSelectReactor._doReadOrWritec                 C   s   | j | dS )zR
        Add a FileDescriptor for notification of data available to read.
        N)r   r#   r   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#   r   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   discardr7   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   r=   r:   r   r   r   removeWriter   s    zSelectReactor.removeWriterc                 C   s   |  | j| jS N)Z
_removeAllr   r   r   r   r   r   	removeAll   s    zSelectReactor.removeAllc                 C   s
   t | jS r@   )r   r   r   r   r   r   
getReaders   s    zSelectReactor.getReadersc                 C   s
   t | jS r@   )r   r   r   r   r   r   
getWriters   s    zSelectReactor.getWritersN)__name__
__module____qualname____doc__r   r%   r2   ZdoIterationr0   r9   r<   r>   r?   rA   rB   rC   r   r   r   r   r   6   s   
	4	r   c                  C   s   t  } ddlm} ||  dS )zIConfigure the twisted mainloop to be run using the select() reactor.
    r   )installReactorN)r   Ztwisted.internet.mainrH   )ZreactorrH   r   r   r   install   s    rI   )N)!rG   Z
__future__r   r   timer   r5   r   r-   errnor   r   Zzope.interfacer   Ztwisted.internet.interfacesr   Ztwisted.internetr	   Ztwisted.pythonr
   Ztwisted.python.runtimer   r   r(   Z"twisted.internet.win32eventreactorr   ImportErrorobjectZ
_extraBaser   r   rI   __all__r   r   r   r   <module>   s.   

 