
    Ϫf                     8   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Zedk(  reZnej                  Z	 ddlmZ eZ ee       G d dej8                  e             Zd ZdgZy# e$ r eZe	e   ed<   Y 9w xY w)z
Select reactor
    N)EBADFEINTR)sleep)Type)implementer)	posixbase)IReactorFDSet)log)platformTypec                     | s#|s!|d}nt        |d      }t        |       g g g fS ||dkD  rd}t        j                  | |||      \  } }}| ||z   g fS )zWin32 select wrapper.g{Gz?gMbP?g      ?)minr   select)rwetimeouts       @/usr/lib/python3/dist-packages/twisted/internet/selectreactor.pywin32selectr      sl    ?G'5)Gg2rz 'C-mmAq!W-GAq!a!eR<    win32)_ThreadedWin32EventsMixin
_extraBasec                   V    e Zd ZdZd Zd Zd ZeZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zy)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                 ~    t               | _        t               | _        t        j                  j                  |        y)zV
        Initialize file descriptor tracking dictionaries and the base class.
        N)set_reads_writesr   PosixReactorBase__init__selfs    r   r    zSelectReactor.__init__D   s*     eu""++D1r   c                    t        j                  d       t        | j                        }t        | j                        }| j                  j                          | j                  j                          | j                  |f| j                  |ffD ]9  \  }}|D ]/  }	 t        j                  |g|g|gd       |j                  |       1 ; y # t        $ r5}t        j                  d|z         | j                  ||d       Y d }~nd }~ww xY w)Nz1Malformed file descriptor found.  Preening lists.r   zbad descriptor %sF)
r
   msglistr   r   clearr   add	Exception_disconnectSelectable)r"   readerswritersselSetselList
selectabler   s          r   _preenDescriptorszSelectReactor._preenDescriptorsL   s    CDt{{#t||$!%g 6w8OP 	+OFG% +
+MM:,zlAN
 JJz*+	+ ! EGG/*<=..z1eDDEs   C	D+DDc                    	 t        | j                  | j                  g |      \  }}}| j                  }t        j                  }|d| j                  f|d| j                  ffD ]  \  }}	}
|D ]  }||
vr |||||	         y# t        $ r | j	                          Y yt
        $ r' t        j                          | j	                          Y yt        $ r{}|j                  d   dv r| j                  s| j                  sY d}~y |j                  d   t        k(  rY d}~y|j                  d   t        k(  r| j	                          Y d}~y d}~ww xY w)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.   s               r   doSelectzSelectReactor.doSelect\   sD   	#DKKr7KMAq'< ##$$$++&	4<<(+
 
	?&K * ?
 U*
E:v>?	
	??  	""$ 	 GGI""$ 	 wwqzV#dllu$u$&&( #	s5   &B E,EE)E
E
&E
	E

Ec                     	  t        ||             }|r| j                  |||dk(         y y # t        $ r. t        j                         d   }t	        j
                          Y Pw xY w)N   r2   )getattrBaseExceptionsysexc_infor
   r7   r)   )r"   r.   rA   whys       r   r:   zSelectReactor._doReadOrWrite   sc    	-'*f-/C &&z3(8JK   	,,.#CGGI	s   - 4A$#A$c                 :    | j                   j                  |       y)zR
        Add a FileDescriptor for notification of data available to read.
        N)r   r'   r"   readers     r   	addReaderzSelectReactor.addReader   s     	r   c                 :    | j                   j                  |       y)zS
        Add a FileDescriptor for notification of data available to write.
        N)r   r'   r"   writers     r   	addWriterzSelectReactor.addWriter   s     	 r   c                 :    | j                   j                  |       y)zQ
        Remove a Selectable for notification of data available to read.
        N)r   discardrL   s     r   removeReaderzSelectReactor.removeReader   s     	F#r   c                 :    | j                   j                  |       y)zR
        Remove a Selectable for notification of data available to write.
        N)r   rT   rP   s     r   removeWriterzSelectReactor.removeWriter   s     	V$r   c                 N    | j                  | j                  | j                        S N)
_removeAllr   r   r!   s    r   	removeAllzSelectReactor.removeAll   s    t{{DLL99r   c                 ,    t        | j                        S rY   )r%   r   r!   s    r   
getReaderszSelectReactor.getReaders   s    DKK  r   c                 ,    t        | j                        S rY   )r%   r   r!   s    r   
getWriterszSelectReactor.getWriters   s    DLL!!r   N)__name__
__module____qualname____doc__r    r/   rC   doIterationr:   rN   rR   rU   rW   r[   r]   r_    r   r   r   r   8   sG    2+ 2?h KL !$%:!"r   r   c                  4    t               } ddlm}  ||        y)zDConfigure the twisted mainloop to be run using the select() reactor.r   )installReactorN)r   twisted.internet.mainrg   )reactorrg   s     r   installrj      s    oG47r   rj   rY   ) rc   r   rH   errnor   r   timer   typingr   zope.interfacer   twisted.internetr   twisted.internet.interfacesr	   twisted.pythonr
   twisted.python.runtimer   r   r4   "twisted.internet.win32eventreactorr   r   ImportErrorobject__annotations__r   r   rj   __all__re   r   r   <module>rx      s   

  
    & & 5  /$ 7GmmG+L +J ]A"I..
 A" A"H +g  &%JV%&s   B BB