
6Mc           @   s0  d  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
  Z e d k r e Z n	 e j Z y d d l m Z Wn e k
 r e Z n Xe Z d e j e f d     YZ d   Z d g Z d S(   s   
Select reactor
i(   t   sleepN(   t   EINTRt   EBADF(   t
   implements(   t   IReactorFDSet(   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   win32(   t   _ThreadedWin32EventsMixint   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   C   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   _preenDescriptorsL   s    #c      	   C   s  y4 t  |  j j   |  j j   g  |  \ } } } Wn t k
 rR |  j   d St k
 rw t j   |  j   d St	 j
 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   d S  n X|  j } t j } xn | d |  j f | d |  j f f D]H \ } }	 }
 x6 | D]. } | |
 k rjqRn  | | | | |	 t  qRWq<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.
        Ni    i   t   doReadt   doWrite(   i    i   (   t   _selectR   R   R   t
   ValueErrorR#   t	   TypeErrorR   t   errR
   t   errort   sockett   IOErrort   argsR   R   t   _doReadOrWritet   callWithLoggert   dict(   R   R   R   R   t   ignoredt   set   _drdwt   _logrunt   selectablest   methodt   fdsetR"   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   doSelect^   s<    



		"c         C   s`   y t  | |    } Wn! t j   d } t j   n X| r\ |  j | | | d k  n  d  S(   Ni   R$   (   t   getattrt   syst   exc_infoR   R)   R   (   R   R"   R6   R0   t   why(    (    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   R=   (    (    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   R?   (    (    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.   R>   R@   RA   RB   RD   RE   RF   (    (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyR   5   s   
				4								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.mainRK   (   t   reactorRK   (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   install   s    	RN   (   RI   t   timeR    R:   R
   R+   t   errnoR   R   t   zope.interfaceR   t   twisted.internet.interfacesR   t   twisted.internetR   t   twisted.pythonR   t   twisted.python.runtimeR   R   R   R&   t"   twisted.internet.win32eventreactorR   t   ImportErrort   objectt
   _extraBaseR   R   RN   t   __all__(    (    (    sB   /usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.pyt   <module>   s(   $		
	