σ
ίόΪ\c           @` sπ  d  d l  m Z m Z m Z d  d l m Z m Z d  d l Z d  d l 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 l m Z m Z d d l m Z m Z m Z m  Z  e j! e"  Z# e d d$  Z$ d e% f d     YZ& e&   Z' d   Z( d e) f d     YZ* d e% f d     YZ+ e%   Z, d e f d     YZ- d e f d     YZ. d e f d      YZ/ d! e f d"     YZ0 e0   e d# <d S(%   i    (   t   print_functiont   divisiont   absolute_import(   t   dequet
   namedtupleN(   t   gent   locks(   t   Future(   t   IOLoopi   (   t   finalize(   t   nested_deserialize(   t   get_ipi   (   t   Backendt   backends(   t   Commt	   Connectort   Listenert   CommClosedErrort   ConnectionRequestt   c2s_qt   s2c_qt   c_loopt   c_addrt
   conn_eventt   Managerc           B` sD   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s?   
    An object coordinating listeners and their addresses.
    c         C` s@   t  j   |  _ t j d  |  _ t   |  _ t j	   |  _
 d  S(   Ni   (   t   weakreft   WeakValueDictionaryt	   listenerst	   itertoolst   countt   addr_suffixesR   t   ipt	   threadingt   Lockt   lock(   t   self(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   __init__"   s    c         C` sF   |  j  7 | |  j k r/ t d | f   n  | |  j | <Wd  QXd  S(   Ns   already listening on %r(   R"   R   t   RuntimeError(   R#   t   addrt   listener(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   add_listener(   s    
c      	   C` s6   |  j  ' y |  j | =Wn t k
 r+ n XWd  QXd  S(   N(   R"   R   t   KeyError(   R#   R&   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   remove_listener.   s
    
c         C` s1   |  j  " |  j |  |  j j |  SWd  QXd  S(   N(   R"   t   validate_addressR   t   get(   R#   R&   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   get_listener_for5   s    
c         C` s#   d |  j  t j   t |  j  f S(   Ns   %s/%d/%s(   R   t   ost   getpidt   nextR   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   new_address:   s    c         C` sh   | j  d  \ } } } | |  j k s? t |  t j   k rd t d | |  j t j   f   n  d S(   s3   
        Validate the address' IP and pid.
        t   /s6   inproc address %r does not match host (%r) or pid (%r)N(   t   splitR   t   intR.   R/   t
   ValueError(   R#   R&   R   t   pidt   suffix(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR+   =   s
    '(	   t   __name__t
   __module__t   __doc__R$   R(   R*   R-   R1   R+   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR      s   					c           C` s   d t  j   S(   s!   
    Generate a new address.
    s	   inproc://(   t   global_managerR1   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR1   L   s    t
   QueueEmptyc           B` s   e  Z RS(    (   R8   R9   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR<   S   s   t   Queuec           B` sM   e  Z d  Z d   Z d   Z d   Z d   Z e Z e   Z	 e	 d  Z
 RS(   sI   
    A single-reader, single-writer, non-threadsafe, peekable queue.
    c         C` s   t    |  _ d  |  _ d  S(   N(   R   t   _qt   Nonet   _read_future(   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR$   \   s    c         C` s"   |  j  } | s t  n  | j   S(   N(   R>   R<   t   popleft(   R#   t   q(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt
   get_nowait`   s    		c         C` sQ   |  j  s t d   t   } |  j } | rD | j | j    n	 | |  _  | S(   Ns   Only one reader allowed(   R@   t   AssertionErrorR   R>   t
   set_resultRA   (   R#   t   futRB   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR,   f   s    			c         C` s`   |  j  } |  j } | d  k	 rO t |  d k s6 t  d  |  _ | j |  n | j |  d  S(   Ni    (   R>   R@   R?   t   lenRD   RE   t   append(   R#   t   valueRB   RF   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt
   put_nowaitp   s    			c         C` s4   |  j  } | r | d S| |  j k	 r* | St  d S(   sV   
        Get the next object in the queue without removing it from the queue.
        i    N(   R>   t   _omittedR<   (   R#   t   defaultRB   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   peek~   s    	(   R8   R9   R:   R$   RC   R,   RJ   t   putt   objectRK   RM   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR=   W   s   			
	
	t   InProcc           B` s   e  Z d  Z e Z e d  Z d   Z e d    Z	 e d    Z
 e j d d   Z e j d d d   Z e j d    Z d	   Z d
   Z RS(   sΌ   
    An established communication based on a pair of in-process queues.

    Reminder: a Comm must always be used from a single thread.
    Its peer Comm can be running in any thread.
    c         C` s}   t  j |   | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ t |  _	 t
 |  |  j    |  _ t |  j _ t |  _ d  S(   N(   R   R$   t   _local_addrt
   _peer_addrt   deserializet   _read_qt   _write_qt   _write_loopt   Falset   _closedR	   t   _get_finalizert
   _finalizert   atexitt   Truet   _initialized(   R#   t
   local_addrt	   peer_addrt   read_qt   write_qt
   write_loopRS   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR$      s    							c         C` s"   |  j  |  j t |   d  } | S(   Nc         S` s+   t  j d | f  | j |  j t  d  S(   Ns   Closing dangling queue in %s(   t   loggert   warningt   add_callbackRJ   t   _EOF(   Ra   Rb   t   r(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR	   ©   s    (   RU   RV   t   repr(   R#   R	   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyRY   ¨   s    c         C` s   |  j  S(   N(   RQ   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   local_address―   s    c         C` s   |  j  S(   N(   RR   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   peer_address³   s    t   ignoredc         c` sx   |  j  r t  n  |  j j   V} | t k rM t |  _  |  j j   t  n  |  j re t	 |  } n  t
 j |   d  S(   N(   RX   R   RT   R,   Rf   R\   RZ   t   detachRS   R
   R   t   Return(   R#   t   deserializerst   msg(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   read·   s    					c         C` sA   |  j    r t  n  |  j j |  j j |  t j d   d  S(   Ni   (   t   closedR   RV   Re   RU   RJ   R   Rm   (   R#   Ro   t   serializerst   on_error(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   writeΖ   s    	c         C` s   |  j    d  S(   N(   t   abort(   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   closeΠ   s    c         C` sb   |  j    s^ |  j j |  j j t  |  j j t  d  |  _ |  _ t |  _	 |  j
 j   n  d  S(   N(   Rq   RV   Re   RU   RJ   Rf   RT   R?   R\   RX   RZ   Rl   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyRu   Τ   s    	c         C` sP   |  j  r t S|  j rH |  j j d  t k rH t |  _  |  j j   t St	 Sd S(   sο   
        Whether this comm is closed.  An InProc comm is closed if:
            1) close() or abort() was called on this comm
            2) close() or abort() was called on the other end and the
               read queue is empty
        N(
   RX   R\   R]   RT   RM   R?   Rf   RZ   Rl   RW   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyRq   έ   s    	!	N(   R8   R9   R:   RW   R]   R\   R$   RY   t   propertyRi   Rj   R   t	   coroutineRp   R?   Rt   Rv   Ru   Rq   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyRP      s   				t   InProcListenerc           B` se   e  Z d  Z e d  Z e j d    Z d   Z d   Z	 d   Z
 e d    Z e d    Z RS(   t   inprocc         C` sC   t  |  _ | p |  j j   |  _ | |  _ | |  _ t   |  _ d  S(   N(   R;   t   managerR1   t   addresst   comm_handlerRS   R=   t   listen_q(   R#   R|   R}   RS   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR$   ς   s
    			c         c` s   x t  r |  j j   V} | d  k r) Pn  t d d |  j d d | j d | j d | j d | j	 d |  j
  } | j	 j | j j  |  j |  q Wd  S(   NR^   s	   inproc://R_   R`   Ra   Rb   RS   (   R\   R~   R,   R?   RP   R|   R   R   R   R   RS   Re   R   t   setR}   (   R#   t   conn_reqt   comm(    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   _listenω   s    				c         C` s   |  j  j |  j j |  d  S(   N(   t   loopRe   R~   RJ   (   R#   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   connect_threadsafe  s    c         C` s<   t  j   |  _ |  j j |  j  |  j j |  j |   d  S(   N(   R   t   currentR   Re   R   R{   R(   R|   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   start  s    c         C` s'   |  j  j d   |  j j |  j  d  S(   N(   R~   RJ   R?   R{   R*   R|   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   stop  s    c         C` s   d |  j  S(   Ns	   inproc://(   R|   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   listen_address  s    c         C` s   d |  j  S(   Ns	   inproc://(   R|   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   contact_address  s    (   R8   R9   t   prefixR\   R$   R   Rx   R   R   R   R   Rw   R   R   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyRy   ο   s   			t   InProcConnectorc           B` s&   e  Z d    Z e j e d   Z RS(   c         C` s   | |  _  d  S(   N(   R{   (   R#   R{   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR$   !  s    c         k` sε   |  j  j |  } | d  k r4 t d | f   n  t d t   d t   d t j   d |  j  j   d t	 j
    } | j |  | j j   Vt d d | j d	 d | d
 | j d | j d | j d |  } t j |   d  S(   Ns!   no endpoint for inproc address %rR   R   R   R   R   R^   s	   inproc://R_   R`   Ra   Rb   RS   (   R{   R-   R?   t   IOErrorR   R=   R   R   R1   R   t   EventR   R   t   waitRP   R   R   R   R   R   Rm   (   R#   R|   RS   t   connection_argsR'   R   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   connect$  s&    		
				(   R8   R9   R$   R   Rx   R\   R   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR      s   	t   InProcBackendc           B` s;   e  Z e Z d    Z d   Z d   Z d   Z d   Z RS(   c         C` s   t  |  j  S(   N(   R   R{   (   R#   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   get_connectorG  s    c         K` s   t  | | |  S(   N(   Ry   (   R#   t   loct   handle_commRS   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   get_listenerJ  s    c         C` s   |  j  j |  |  j  j S(   N(   R{   R+   R   (   R#   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   get_address_hostO  s    c         C` s   | S(   N(    (   R#   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   resolve_addressS  s    c         C` s   |  j  j |  |  j  j   S(   N(   R{   R+   R1   (   R#   R   (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   get_local_address_forV  s    (	   R8   R9   R;   R{   R   R   R   R   R   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyR   B  s   				Rz   (   R   R   R   R   R   (1   t
   __future__R    R   R   t   collectionsR   R   R   t   loggingR.   R    R   t   tornadoR   R   t   tornado.concurrentR   t   tornado.ioloopR   t   compatibilityR	   t   protocolR
   t   utilsR   t   registryR   R   t   coreR   R   R   R   t	   getLoggerR8   Rc   R   RO   R   R;   R1   t	   ExceptionR<   R=   Rf   RP   Ry   R   R   (    (    (    s6   lib/python2.7/site-packages/distributed/comm/inproc.pyt   <module>   s8   ",		4	a1"