ó
/9Nc           @   sW  d  d l  m Z d  d l m Z d  d l m Z m Z d  d l m Z d  d l 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 m Z d  d l m Z m Z m Z d  d l m Z d  d l m Z d  d l Z d  d l m Z m Z d  d l m  Z  d „  Z! d „  Z" d e j# f d „  ƒ  YZ$ d „  Z% d g Z& d S(   iÿÿÿÿ(   t
   generators(   t   Thread(   t   Queuet   Empty(   t   sleepN(   t
   implements(   t   IReactorFDSet(   t   error(   t	   posixbase(   t
   _NO_FILENOt   _NO_FILEDESC(   t   logt   failuret
   threadable(   t   styles(   t   platformType(   t   EINTRt   EBADF(   t   _selectc         C   s#   y |  | =Wn t  k
 r n Xd  S(   N(   t   KeyError(   t   dctt   value(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   dictRemoveO   s    c         C   s
   |  ‚ d  S(   N(    (   t   e(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   raiseExceptionU   s    t   ThreadedSelectReactorc           B   s  e  Z d  Z e e ƒ d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z d
 „  Z e Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z  RS(   sV   A threaded select() based reactor - runs on all POSIX platforms and on
    Win32.
    c         C   ss   t  j d ƒ i  |  _ i  |  _ t ƒ  |  _ t ƒ  |  _ d  |  _ d  |  _	 t
 j j |  ƒ |  j d d |  j ƒ d  S(   Ni   t   aftert   shutdown(   R   t   initt   readst   writesR   t   toThreadQueuet   toMainThreadt   Nonet   workerThreadt	   mainWakerR   t   PosixReactorBaset   __init__t   addSystemEventTriggert   _mainLoopShutdown(   t   self(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR%   ^   s    				c         C   s   |  j  j ƒ  d  S(   N(   t   wakert   wakeUp(   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR*   i   s    c         O   s&   t  j j |  | | Ž } |  j ƒ  | S(   N(   R   R$   t	   callLaterR*   (   R(   t   argst   kwt   tple(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR+   m   s    
c         G   s6   |  j  j | | f ƒ |  j d  k	 r2 |  j ƒ  n  d  S(   N(   R    t   putR#   R!   (   R(   t   msgR,   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _sendToMainr   s    c         G   s   |  j  j | | f ƒ d  S(   N(   R   R/   (   R(   t   fnR,   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _sendToThreadx   s    c         C   sÑ   t  j d ƒ |  j j ƒ  } |  j j ƒ  } |  j j ƒ  |  j j ƒ  x… |  j | f |  j | f f D]e \ } } xV | D]N } y# t j | g | g | g d ƒ Wn t  j d | ƒ qw Xd | | <qw Wqd Wd  S(   Ns1   Malformed file descriptor found.  Preening lists.i    s   bad descriptor %si   (   R   R0   R   t   keysR   t   cleart   select(   R(   t   readerst   writerst   selDictt   selListt
   selectable(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _preenDescriptorsInThread|   s    +#c         C   sc   y) x" |  j  j ƒ  \ } } | | Œ  q Wn3 t k
 r< n# t j ƒ  } |  j d | ƒ n Xd  S(   Nt   Failure(   R   t   gett
   SystemExitR   R=   R1   (   R(   R2   R,   t   f(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _workerInThread‹   s    c   
      C   s.  |  j  } |  j } xy/ t | j ƒ  | j ƒ  g  | ƒ \ } } } PWq t k
 rm } t j ƒ  |  j ƒ  q t k
 r“ } t j ƒ  |  j ƒ  q t	 j
 t f k
 r}	 |	 j d d k rÖ | rÐ | rÐ d S‚  q|	 j d t k rí d S|	 j d t k r|  j ƒ  q‚  q Xq |  j d | | ƒ d 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   Notify(   i    i   (   R   R   R   R4   t
   ValueErrorR   t   errR<   t	   TypeErrorR6   R   t   IOErrorR,   R   R   R1   (
   R(   t   timeoutR   R   t   rt   wt   ignoredt   vet   tet   se(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _doSelectInThread˜   s2    			


c         C   s“   |  j  } |  j } |  j } t j } xh | d | f | d | f f D]H \ } } }	 x6 | D]. }
 |
 |	 k rq qY n  | |
 | |
 | |	 ƒ qY WqC Wd  S(   Nt   doReadt   doWrite(   R   R   t   _doReadOrWriteR   t   callWithLogger(   R(   RH   RI   R   R   t   _drdwt   _logrunt   selectablest   methodR   R;   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _process_NotifyÀ   s    				.c         C   s   | j  ƒ  d  S(   N(   R   (   R(   R@   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _process_FailureÐ   s    c         C   sH   |  j  d  k s |  j  j ƒ  rD t d |  j ƒ |  _  |  j  j ƒ  n  d  S(   Nt   target(   R"   R!   t   isAliveR   RA   t   start(   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   ensureWorkerThreadÕ   s    c         C   sM   |  j  |  j | ƒ |  j ƒ  |  j j ƒ  \ } } t |  d | ƒ | Œ  d  S(   Nt	   _process_(   R3   t   _doIterationInThreadR\   R    R>   t   getattr(   R(   RG   R0   R,   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   doThreadIterationÚ   s    
c         c   s}   xv |  j  rx |  j ƒ  |  j ƒ  } |  j  o. | } |  j |  j | ƒ d  V|  j j ƒ  \ } } t |  d | ƒ | Œ  q Wd  S(   NR]   (	   t   runningt   runUntilCurrentRG   R3   R^   R!   R    t
   get_nowaitR_   (   R(   t   t2t   tR0   R,   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   _interleaveä   s    
c         O   sL   |  j  | | Ž  |  j ƒ  } | | d „ } | |  _ | j ƒ  |  j ƒ  d S(   s„  
        interleave(waker) interleaves this reactor with the
        current application by moving the blocking parts of
        the reactor (select() in this case) to a separate
        thread.  This is typically useful for integration with
        GUI applications which have their own event loop
        already running.

        See the module docstring for more information.
        c         S   s   |  | j  ƒ d  S(   N(   t   next(   R)   t   loop(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR#   þ   s    N(   t   startRunningRf   R#   Rg   R\   (   R(   R)   R,   R-   Rh   R#   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   interleaveñ   s    	
c         C   sý   d  |  _ |  j d  k	 r~ |  j t t ƒ |  j ƒ  y x |  j j ƒ  \ } } q8 Wn t	 k
 rd n X|  j j
 ƒ  d  |  _ n  yg x` |  j j ƒ  \ } } | |  j k r¸ t j d ƒ q„ | t k r× | d t k r× q„ | | Œ  q„ Wn t	 k
 rø n Xd  S(   Ns'   Iteration is still in the thread queue!i    (   R!   R#   R"   R3   R   R?   R*   R    Rc   R   t   joinR   R^   R   R0   (   R(   R0   R,   R2   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR'     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   filenoiÿÿÿÿi   RO   (	   R_   R!   R	   R
   t   syst   exc_infoR   RD   t   _disconnectSelectable(   R(   R;   RV   t   dictt   whyt   handfn(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyRQ     s    	c         C   s'   |  j  |  j j | d ƒ |  j ƒ  d S(   sI   Add a FileDescriptor for notification of data available to read.
        i   N(   R3   R   t   __setitem__R*   (   R(   t   reader(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   addReader-  s    c         C   s'   |  j  |  j j | d ƒ |  j ƒ  d S(   sJ   Add a FileDescriptor for notification of data available to write.
        i   N(   R3   R   Rs   R*   (   R(   t   writer(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   addWriter3  s    c         C   s   |  j  t |  j | ƒ d S(   sH   Remove a Selectable for notification of data available to read.
        N(   R3   R   R   (   R(   Rt   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   removeReader9  s    c         C   s   |  j  t |  j | ƒ d S(   sI   Remove a Selectable for notification of data available to write.
        N(   R3   R   R   (   R(   Rv   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   removeWriter>  s    c         C   s   |  j  |  j |  j ƒ S(   N(   t
   _removeAllR   R   (   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   removeAllC  s    c         C   s   |  j  j ƒ  S(   N(   R   R4   (   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   getReadersG  s    c         C   s   |  j  j ƒ  S(   N(   R   R4   (   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   getWritersK  s    c         C   s   t  j j |  ƒ |  j ƒ  d S(   s›   
        Extend the base stop implementation to also wake up the select thread so
        that C{runUntilCurrent} notices the reactor should stop.
        N(   R   R$   t   stopR*   (   R(   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR~   O  s    i   c         C   s   |  j  d | ƒ |  j ƒ  d  S(   Nt   installSignalHandlers(   Ri   t   mainLoop(   R(   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   runX  s    c         C   sS   t  ƒ  } |  j | j ƒ x3 |  j rN y | j ƒ  ƒ  Wq t k
 rJ Pq Xq Wd  S(   N(   R   Rj   R/   Ra   R>   t   StopIteration(   R(   t   q(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR€   \  s    	(!   t   __name__t
   __module__t   __doc__R   R   R%   R*   R+   R1   R3   R<   RA   RN   RW   RX   R^   R\   R`   t   doIterationRf   Rj   R'   RQ   Ru   Rw   Rx   Ry   R{   R|   R}   R~   R   R€   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR   X   s<   
								(																	c          C   s'   t  ƒ  }  d d l m } | |  ƒ |  S(   sI   Configure the twisted mainloop to be run using the select() reactor.
    iÿÿÿÿ(   t   installReactor(   R   t   twisted.internet.mainRˆ   (   t   reactorRˆ   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   installg  s    	
R‹   ('   t
   __future__R    t	   threadingR   R   R   t   timeR   Rm   t   zope.interfaceR   t   twisted.internet.interfacesR   t   twisted.internetR   R   t   twisted.internet.posixbaseR	   R
   t   twisted.pythonR   R   R   t   twisted.persistedR   t   twisted.python.runtimeR   R6   t   errnoR   R   t   twisted.internet.selectreactorR   R   R   R$   R   R‹   t   __all__(    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   <module>   s*   5		ÿ 	