ó
[³XMc           @   s_  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 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 e j d ƒ Z e j d ƒ 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   logt   failuret
   threadable(   t   styles(   t   platformType(   t   EINTRt   EBADF(   t   _selects   Handler has no fileno methods   Filedescriptor went awayc         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
   dictRemoveR   s    c         C   s
   |  ‚ d  S(   N(    (   t   e(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   raiseExceptionX   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#   a   s    				c         C   s   |  j  j ƒ  d  S(   N(   t   wakert   wakeUp(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR(   l   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)   p   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   _sendToMainu   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   _sendToThread{   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	   R.   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;   R/   (   R&   R0   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   R2   t
   ValueErrorR	   t   errR:   t	   TypeErrorR4   R   t   IOErrorR*   R   R   R/   (
   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&   RF   RG   R   R   t   _drdwt   _logrunt   selectablest   methodR   R9   (    (    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   R?   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_(   R1   t   _doIterationInThreadRZ   R   R<   t   getattr(   R&   RE   R.   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   runUntilCurrentRE   R1   R\   R   R   t
   get_nowaitR]   (   R&   t   t2t   tR.   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   startRunningRd   R!   Re   RZ   (   R&   R'   R*   R+   Rf   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    R1   R   R=   R(   R   Ra   R   t   joinR   R\   R	   R.   (   R&   R.   R*   R0   (    (    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   RM   (	   R]   R   t
   _NO_FILENOt   _NO_FILEDESCt   syst   exc_infoR	   RB   t   _disconnectSelectable(   R&   R9   RT   t   dictt   whyt   handfn(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyRO   "  s    	c         C   s'   |  j  |  j j | d ƒ |  j ƒ  d S(   sI   Add a FileDescriptor for notification of data available to read.
        i   N(   R1   R   t   __setitem__R(   (   R&   t   reader(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   addReader0  s    c         C   s'   |  j  |  j j | d ƒ |  j ƒ  d S(   sJ   Add a FileDescriptor for notification of data available to write.
        i   N(   R1   R   Rs   R(   (   R&   t   writer(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   addWriter6  s    c         C   s   |  j  t |  j | ƒ d S(   sH   Remove a Selectable for notification of data available to read.
        N(   R1   R   R   (   R&   Rt   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   removeReader<  s    c         C   s   |  j  t |  j | ƒ d S(   sI   Remove a Selectable for notification of data available to write.
        N(   R1   R   R   (   R&   Rv   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   removeWriterA  s    c         C   s   |  j  |  j |  j ƒ S(   N(   t
   _removeAllR   R   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt	   removeAllF  s    c         C   s   |  j  j ƒ  S(   N(   R   R2   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   getReadersJ  s    c         C   s   |  j  j ƒ  S(   N(   R   R2   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt
   getWritersN  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~   R  s    i   c         C   s   |  j  d | ƒ |  j ƒ  d  S(   Nt   installSignalHandlers(   Rg   t   mainLoop(   R&   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   run[  s    c         C   sS   t  ƒ  } |  j | j ƒ x3 |  j rN y | j ƒ  ƒ  Wq t k
 rJ Pq Xq Wd  S(   N(   R   Rh   R-   R_   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)   R/   R1   R:   R?   RL   RU   RV   R\   RZ   R^   t   doIterationRd   Rh   R%   RO   Ru   Rw   Rx   Ry   R{   R|   R}   R~   R   R€   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyR   [   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   installj  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.pythonR	   R
   R   t   twisted.persistedR   t   twisted.python.runtimeR   R4   t   errnoR   R   t   twisted.internet.selectreactorR   t   ConnectionFdescWentAwayRk   Rl   R   R   R"   R   R‹   t   __all__(    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/_threadedselect.pyt   <module>   s,   5		ÿ 	