
[XMc           @   s  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 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 e j d  Z e j d  Z d e j f d     YZ d   Z d g Z d S(   s4   
Select reactor

Maintainer: Itamar Shtull-Trauring
i(   t   sleepN(   t   EINTRt   EBADF(   t
   implements(   t   IReactorFDSet(   t   error(   t	   posixbase(   t   log(   t   platformTypec         C   s   |  p	 | sG | d k r! d } n t | d  } t |  g  g  g  f S| d k s_ | d k rh d } n  t j |  | | |  \ }  } } |  | | g  f S(   s   Win32 select wrapper.g{Gz?gMbP?g      ?N(   t   Nonet   minR    t   select(   t   rt   wt   et   timeout(    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   win32select   s    	
	!t   win32s   Handler has no fileno methods   Filedescriptor went awayt   SelectReactorc           B   s   e  Z d  Z e e  d   Z d   Z d   Z e Z d   Z	 d   Z
 d   Z d   Z d   Z d	   Z d
   Z d   Z RS(   s  
    A select() based reactor - runs on all POSIX platforms and on Win32.

    @ivar _reads: A dictionary mapping L{FileDescriptor} instances to arbitrary
        values (this is essentially a set).  Keys in this dictionary will be
        checked for read events.

    @ivar _writes: A dictionary mapping L{FileDescriptor} instances to
        arbitrary values (this is essentially a set).  Keys in this dictionary
        will be checked for writability.
    c         C   s&   i  |  _  i  |  _ t j j |   d S(   sV   
        Initialize file descriptor tracking dictionaries and the base class.
        N(   t   _readst   _writesR   t   PosixReactorBaset   __init__(   t   self(    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyR   B   s    		c         C   s   t  j d  |  j j   } |  j j   } |  j j   |  j j   x |  j | f |  j | f f D] \ } } xu | D]m } y# t j | g | g | g d  Wn7 t k
 r } t  j d |  |  j | | t	  qw Xd | | <qw Wqd Wd  S(   Ns1   Malformed file descriptor found.  Preening lists.i    s   bad descriptor %si   (
   R   t   msgR   t   keysR   t   clearR   t	   Exceptiont   _disconnectSelectablet   False(   R   t   readerst   writerst   selDictt   selListt
   selectableR   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   _preenDescriptorsK   s    #c         C   s  xy5 t  |  j j   |  j j   g  |  \ } } } PWq t k
 ra } t j   |  j   q t k
 r } t j   |  j   q t	 j
 t f k
 r} | j d d k r |  j r |  j r d S  q| j d t k r d S| j d t k r|  j   q  q Xq |  j } t j }	 xn | d |  j f | d |  j f f D]H \ }
 } } x6 |
 D]. } | | k rvq^n  |	 | | | | t  q^WqHWd S(   s   
        Run one iteration of the I/O monitor loop.

        This will run all selectables who had input or output readiness
        waiting for them.
        i    i   Nt   doReadt   doWrite(   i    i   (   t   _selectR   R   R   t
   ValueErrorR   t   errR#   t	   TypeErrorR   R   t   IOErrort   argsR   R   t   _doReadOrWritet   callWithLoggert   dict(   R   R   R   R   t   ignoredt   vet   tet   set   _drdwt   _logrunt   selectablest   methodt   fdsetR"   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   doSelect]   s<    


		"c         C   s   yO t  | |    } t  | d d   } | s6 t } n |   d k rN t } n  Wn! t j   d } t j   n X| r |  j | | | d k  n  d  S(   Nt   filenoii   R$   (	   t   getattrR	   t
   _NO_FILENOt   _NO_FILEDESCt   syst   exc_infoR   R(   R   (   R   R"   R6   R.   t   whyt   handfn(    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyR,      s    	c         C   s   d |  j  | <d S(   sR   
        Add a FileDescriptor for notification of data available to read.
        i   N(   R   (   R   t   reader(    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt	   addReader   s    c         C   s   d |  j  | <d S(   sS   
        Add a FileDescriptor for notification of data available to write.
        i   N(   R   (   R   t   writer(    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt	   addWriter   s    c         C   s    | |  j  k r |  j  | =n  d S(   sQ   
        Remove a Selectable for notification of data available to read.
        N(   R   (   R   RA   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   removeReader   s    c         C   s    | |  j  k r |  j  | =n  d S(   sR   
        Remove a Selectable for notification of data available to write.
        N(   R   (   R   RC   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   removeWriter   s    c         C   s   |  j  |  j |  j  S(   N(   t
   _removeAllR   R   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt	   removeAll   s    c         C   s   |  j  j   S(   N(   R   R   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt
   getReaders   s    c         C   s   |  j  j   S(   N(   R   R   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt
   getWriters   s    (   t   __name__t
   __module__t   __doc__R   R   R   R#   R8   t   doIterationR,   RB   RD   RE   RF   RH   RI   RJ   (    (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyR   4   s   
				1							c          C   s'   t    }  d d l m } | |   d S(   sI   Configure the twisted mainloop to be run using the select() reactor.
    i(   t   installReactorN(   R   t   twisted.internet.mainRO   (   t   reactorRO   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   install   s    	RR   (   RM   t   timeR    R=   R   t   errnoR   R   t   zope.interfaceR   t   twisted.internet.interfacesR   t   twisted.internetR   R   t   twisted.pythonR   t   twisted.python.runtimeR   R	   R   R&   t   ConnectionFdescWentAwayR;   R<   R   R   RR   t   __all__(    (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   <module>
   s&   			