ó
L]c           @   s™   d  Z  d d l m Z m Z d d l m Z d d l m Z m Z m	 Z	 d d l Z
 e d d ƒ Z d e
 j f d „  ƒ  YZ d e
 j f d „  ƒ  YZ d S(   s%   Future-returning APIs for coroutines.iÿÿÿÿ(   t
   namedtuplet   deque(   t   chain(   t   EVENTSt   POLLOUTt   POLLINNt   _FutureEventt   futuret   kindt   kwargst   msgt   _AsyncPollerc           B   s   e  Z d  Z d d „ Z RS(   s:   Poller that returns a Future on poll, instead of blocking.iÿÿÿÿc            sQ  ˆ j  ƒ  ‰  | d k rh y t t ˆ ƒ j d ƒ } Wn  t k
 rV } ˆ  j | ƒ n Xˆ  j | ƒ ˆ  Sˆ j ƒ  ‰ ˆ j  ƒ  ‰ g  ‰ ‡ f d †  } ˆ j ‡ ‡ ‡ f d †  ƒ xü ˆ j	 D]ñ \ } } t
 | t j ƒ rIt
 | ˆ j ƒ s ˆ j j | ƒ } n  | t j @r#| j d d ˆ ƒn  | t j @r¬| j d d ˆ ƒq¬q» ˆ j | ƒ d } | t j @ry| ˆ j O} n  | t j @r–| ˆ j O} n  ˆ j ˆ | | | ƒ q» W‡  ‡ ‡ f d †  } ˆ j | ƒ | d k	 r1| d k r1‡ f d †  }	 ˆ j d | |	 ƒ ‰ ‡ ‡ f d	 †  }
 ˆ  j |
 ƒ n  ‡ f d
 †  } ˆ  j | ƒ ˆ  S(   s    Return a Future for a poll eventi    c             s    ˆ  j  ƒ  s ˆ  j d  ƒ n  d  S(   N(   t   donet
   set_resultt   None(   t   args(   t   watcher(    s*   lib/python2.7/site-packages/zmq/_future.pyt   wake_raw-   s    c            s   ˆ j  ˆ  ˆ Œ S(   N(   t   _unwatch_raw_sockets(   t   f(   t   loopt   raw_socketst   self(    s*   lib/python2.7/site-packages/zmq/_future.pyt   <lambda>1   t    t   pollR   c            s´   ˆ  j  ƒ  r d  Sˆ j ƒ  rB y ˆ  j ƒ  Wn t k
 r= n Xd  Sˆ j ƒ  rd ˆ  j ˆ j ƒ  ƒ nL y t t ˆ ƒ j d ƒ } Wn  t	 k
 r¢ } ˆ  j | ƒ n Xˆ  j
 | ƒ d  S(   Ni    (   R   t	   cancelledt   cancelt   RuntimeErrort	   exceptiont   set_exceptiont   superR   R   t	   ExceptionR   (   R   t   resultt   e(   R   R   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   on_poll_readyE   s    c              s    ˆ  j  ƒ  s ˆ  j d  ƒ n  d  S(   N(   R   R   R   (    (   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   trigger_timeout\   s    gü©ñÒMbP?c            s-   t  ˆ d ƒ r ˆ j ƒ  n ˆ  j ˆ ƒ d  S(   NR   (   t   hasattrR   t   remove_timeout(   R   (   R   t   timeout_handle(    s*   lib/python2.7/site-packages/zmq/_future.pyt   cancel_timeoutd   s    c            s   ˆ  j  ƒ  s ˆ  j ƒ  n  d  S(   N(   R   R   (   R   (   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   cancel_watcherk   s    N(   t   _FutureR   R   R   R    R   R   t   _default_loopt   add_done_callbackt   socketst
   isinstancet   _zmqt   Sockett   _socket_classt   from_socketR   t   _add_recv_eventR   t   _add_send_eventt   appendt   _READt   _WRITEt   _watch_raw_socketR   t
   call_later(   R   t   timeoutR!   R"   R   t   sockett   maskt   evtR#   R$   R(   R)   (    (   R   R   R   R   R'   R   s*   lib/python2.7/site-packages/zmq/_future.pyR      sP    	(   t   __name__t
   __module__t   __doc__R   (    (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR      s   t   _AsyncSocketc           B   sŽ  e  Z d Z d Z d  Z d Z e Z d Z	 d Z
 d d d d „ Z e d d „ ƒ Z d d „ Z e j j j e _ d „  Z e j j j e _ d  e e d „ Z d  e e d „ Z d  e e d „ Z d  e e d	 „ Z d
 „  Z d e j d „ Z d „  Z d „  Z e d „  ƒ Z d d d „ Z  d d d d „ Z! d „  Z" d „  Z# d  d  d „ Z$ d d „ Z% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* RS(   i    iÿÿÿÿc         K   sï   t  | t j ƒ r" d  | } } n | j d d  ƒ } | d  k	 rh t t |  ƒ j d | j ƒ | |  _	 n4 t t |  ƒ j | | |  t j j
 |  j ƒ |  _	 | p« |  j ƒ  |  _ t ƒ  |  _ t ƒ  |  _ d |  _ |  j	 j |  _ |  j ƒ  d  S(   Nt   _from_sockett   shadowi    (   R.   R/   R0   R   t   popR   RA   t   __init__t
   underlyingt   _shadow_sockRC   R+   t   io_loopR   t   _recv_futurest   _send_futurest   _statet   FDt   _fdt   _init_io_state(   R   t   contextt   socket_typeRH   R	   R2   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRE   }   s    	c         C   s   |  d | d | ƒ S(   s.   Create an async socket from an existing SocketRB   RH   (    (   t   clsR;   RH   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR2      s    c         C   s   |  j  ss xZ t t |  j |  j ƒ ƒ D]= } | j j ƒ  s% y | j j ƒ  Wqb t k
 r^ qb Xq% q% W|  j	 ƒ  n  t
 t |  ƒ j d | ƒ d  S(   Nt   linger(   t   closedt   listR   RI   RJ   R   R   R   R   t   _clear_io_stateR   RA   t   close(   R   RR   t   event(    (    s*   lib/python2.7/site-packages/zmq/_future.pyRV   ”   s    	"c         C   s8   t  t |  ƒ j | ƒ } | t k r4 |  j | ƒ n  | S(   N(   R   RA   t   getR   t   _schedule_remaining_events(   R   t   keyR!   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRX   ¡   s    c      	   C   s%   |  j  d t d | d | d | ƒ ƒ S(   s~   Receive a complete multipart zmq message.
        
        Returns a Future whose result will be a multipart message.
        t   recv_multipartt   flagst   copyt   track(   R3   t   dict(   R   R\   R]   R^   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR[   ¨   s    	c      	   C   s%   |  j  d t d | d | d | ƒ ƒ S(   s™   Receive a single zmq frame.

        Returns a Future, whose result will be the received frame.

        Recommend using recv_multipart instead.
        t   recvR\   R]   R^   (   R3   R_   (   R   R\   R]   R^   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR`   ±   s    	c         K   s7   | | d <| | d <| | d <|  j  d d | d | ƒS(   sq   Send a complete multipart zmq message.

        Returns a Future that resolves when sending is complete.
        R\   R]   R^   t   send_multipartR
   R	   (   R4   (   R   R
   R\   R]   R^   R	   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRa   ¼   s    


c         K   sY   | | d <| | d <| | d <| j  t d | d | d | ƒ ƒ |  j d d | d | ƒS(   s”   Send a single zmq frame.

        Returns a Future that resolves when sending is complete.

        Recommend using send_multipart instead.
        R\   R]   R^   t   sendR
   R	   (   t   updateR_   R4   (   R   R
   R\   R]   R^   R	   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRb   Æ   s
    


"c            sQ   |  j  ƒ  ‰  ‡  ‡ ‡ f d †  } ˆ j | ƒ ‡  ‡ f d †  } ˆ  j | ƒ ˆ  S(   s   Deserialize with Futuresc            s‚   ˆ  j  ƒ  r d Sˆ j ƒ  r2 ˆ  j ˆ j ƒ  ƒ nL ˆ j ƒ  } y ˆ | ƒ } Wn  t k
 rp } ˆ  j | ƒ n Xˆ  j | ƒ d S(   s+   Chain result through serialization to recvdN(   R   R   R   R!   R    R   (   t   _t   buft   loadedR"   (   R   t   loadt   recvd(    s*   lib/python2.7/site-packages/zmq/_future.pyt   _chainÖ   s    c            s-   ˆ j  ƒ  r d Sˆ  j ƒ  r) ˆ j ƒ  n  d S(   s"   Chain cancellation from f to recvdN(   R   R   R   (   Rd   (   R   Rh   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   _chain_cancelæ   s    (   R*   R,   (   R   Rh   Rg   Ri   Rj   (    (   R   Rg   Rh   s*   lib/python2.7/site-packages/zmq/_future.pyt   _deserializeÓ   s    c            s‘   ˆ j  r t j t j ƒ ‚ n  ˆ j ƒ  } | j ˆ | ƒ | j | ƒ } ˆ j ƒ  ‰  ‡  ‡ f d †  } | j ƒ  r€ | | ƒ n | j	 | ƒ ˆ  S(   sS   poll the socket for events

        returns a Future for the poll results.
        c            s“   ˆ  j  ƒ  r d  S|  j ƒ  rB y ˆ  j ƒ  Wn t k
 r= n Xd  S|  j ƒ  rd ˆ  j |  j ƒ  ƒ n+ t |  j ƒ  ƒ } ˆ  j | j	 ˆ d ƒ ƒ d  S(   Ni    (
   R   R   R   R   R   R   R_   R!   R   RX   (   R   t   evts(   R   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   unwrap_resultþ   s    (
   RS   R/   t   ZMQErrort   ENOTSUPt   _poller_classt   registerR   R*   R   R,   (   R   R:   R\   t   pR   Rm   (    (   R   R   s*   lib/python2.7/site-packages/zmq/_future.pyR   ð   s    	c            s#   ‡  f d †  } |  j  | | ƒ d S(   s'   Add a timeout for a send or recv Futurec              s'   ˆ  j  ƒ  r d  Sˆ  j t j ƒ  ƒ d  S(   N(   R   R   R/   t   Again(    (   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyt   future_timeout  s    N(   t   _call_later(   R   R   R:   Rt   (    (   R   s*   lib/python2.7/site-packages/zmq/_future.pyt   _add_timeout  s    c         C   s   |  j  j | | ƒ d S(   sÊ   Schedule a function to be called later

        Override for different IOLoop implementations

        Tornado and asyncio happen to both have ioloop.call_later
        with the same signature.
        N(   RH   R9   (   R   t   delayt   callback(    (    s*   lib/python2.7/site-packages/zmq/_future.pyRu      s    c         C   sq   t  |  d t ƒ r d Sx: t | ƒ D]( \ } \ } } } } | |  k r# Pq# q# Wd St |  _ | j | | ƒ d S(   s°   Make sure that futures are removed from the event list when they resolve

        Avoids delaying cleanup until the next send/recv event,
        which may never come.
        t   _pyzmq_poppedN(   t   getattrt   Falset	   enumeratet   TrueRy   t   remove(   R   t
   event_listt   f_idxR   R   R	   Rd   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyt   _remove_finished_future*  s    %	c   	         sI  | p ˆ  j  ƒ  } | j d ƒ r | j d d ƒ t j @r t ˆ  j | ƒ } y | |   } Wn  t k
 r~ } | j | ƒ n X| j	 | ƒ | Sˆ  j
 j t | | | d d ƒƒ | j ‡  f d †  ƒ t t d ƒ r	ˆ  j j } | d k r	ˆ  j | | d ƒ q	n  ˆ  j j t ƒ t @r,ˆ  j ƒ  n  ˆ  j
 rEˆ  j t ƒ n  | S(	   s4   Add a recv event, returning the corresponding FutureR`   R\   i    R
   c            s   ˆ  j  |  ˆ  j ƒ S(   N(   R   RI   (   R   (   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyR   P  R   t   RCVTIMEOgü©ñÒMbP?N(   R*   t
   startswithRX   R/   t   DONTWAITRz   RG   R    R   R   RI   R5   R   R   R,   R%   t   rcvtimeoRv   R   R   t   _handle_recvt   _add_io_state(	   R   R   R	   R   R   R`   t   rR"   t
   timeout_ms(    (   R   s*   lib/python2.7/site-packages/zmq/_future.pyR3   ;  s*    (		c            s£  | p ˆ  j  ƒ  } | d
 k rˆ  j r| j d d ƒ } | j ƒ  } | t j B| d <t ˆ  j | ƒ } t }	 y | | |  }
 WnX t j	 k
 r½ } | t j @r´ | j
 | ƒ qê t }	 n- t k
 rÜ } | j
 | ƒ n X| j |
 ƒ |	 rˆ  j rˆ  j ƒ  n  | Sn  ˆ  j j t | | d | d | ƒƒ | j ‡  f d †  ƒ t t d ƒ r’ˆ  j j t j ƒ } | d k r’ˆ  j | | d	 ƒ q’n  ˆ  j t ƒ | S(   s4   Add a send event, returning the corresponding FutureRb   Ra   R\   i    R	   R
   c            s   ˆ  j  |  ˆ  j ƒ S(   N(   R   RJ   (   R   (   R   (    s*   lib/python2.7/site-packages/zmq/_future.pyR   Œ  R   t   SNDTIMEOgü©ñÒMbP?(   Rb   Ra   (   R*   RJ   RX   R]   R/   R„   Rz   RG   R}   Rs   R   R{   R    R   RI   RY   R5   R   R,   R%   RŠ   Rv   R‡   R   (   R   R   R
   R	   R   R   R\   t   nowait_kwargsRb   t   finish_earlyRˆ   R"   R‰   (    (   R   s*   lib/python2.7/site-packages/zmq/_future.pyR4   ^  s<    
			c         C   sM  |  j  j t ƒ t @s d Sd } xG |  j ri |  j j ƒ  \ } } } } t | _ | j	 ƒ  re d } q# Pq# W|  j sƒ |  j
 t ƒ n  | d k r“ d S| d k r° | j d ƒ d S| d k rË |  j  j } n+ | d k ræ |  j  j } n t d | ƒ ‚ | d c t j O<y | |   } Wn  t k
 r;} | j | ƒ n X| j | ƒ d S(   s   Handle recv eventsNR   R[   R`   s   Unhandled recv event type: %rR\   (   RG   RX   R   R   R   RI   t   popleftR}   Ry   R   t   _drop_io_stateR   R[   R`   t
   ValueErrorR/   R„   R    R   (   R   R   R   R	   Rd   R`   R!   R"   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR†   –  s6    			c         C   sP  |  j  j t ƒ t @s d  Sd  } xG |  j ri |  j j ƒ  \ } } } } t | _ | j	 ƒ  re d  } q# Pq# W|  j sƒ |  j
 t ƒ n  | d  k r“ d  S| d k r° | j d  ƒ d  S| d k rË |  j  j } n+ | d k ræ |  j  j } n t d | ƒ ‚ | d c t j O<y | | |  } Wn  t k
 r>} | j | ƒ n X| j | ƒ d  S(   NR   Ra   Rb   s   Unhandled send event type: %rR\   (   RG   RX   R   R   R   RJ   R   R}   Ry   R   RŽ   R   Ra   Rb   R   R/   R„   R    R   (   R   R   R   R	   R
   Rb   R!   R"   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyt   _handle_send¾  s6    			c         C   sT   |  j  j t ƒ } | t j @r, |  j ƒ  n  | t j @rF |  j ƒ  n  |  j ƒ  d S(   s(   Dispatch IO events to _handle_recv, etc.N(	   RG   RX   R   R/   R   R†   R   R   RY   (   R   t   fdt   eventst
   zmq_events(    (    s*   lib/python2.7/site-packages/zmq/_future.pyt   _handle_eventsæ  s    c         C   s[   |  j  d k r d S| d k r4 |  j j t ƒ } n  | |  j  @rW |  j d |  j ƒ n  d S(   sk   Schedule a call to handle_events next loop iteration

        If there are still events to handle.
        i    N(   RK   R   RG   RX   R   Ru   R”   (   R   R’   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRY   ï  s    c         C   s:   |  j  | k r& |  j  | B} |  _  n  |  j |  j  ƒ d S(   s   Add io_state to poller.N(   RK   t   _update_handler(   R   t   state(    (    s*   lib/python2.7/site-packages/zmq/_future.pyR‡   ÿ  s    c         C   s5   |  j  | @r! |  j  | @|  _  n  |  j |  j  ƒ d S(   s&   Stop poller from watching an io_state.N(   RK   R•   (   R   R–   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRŽ     s    c         C   s   |  j  ƒ  d S(   sO   Update IOLoop handler with state.

        zmq FD is always read-only.
        N(   RY   (   R   R–   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyR•     s    c         C   s6   |  j  j |  j |  j |  j ƒ |  j d |  j ƒ d S(   s#   initialize the ioloop event handleri    N(   RH   t   add_handlerRG   R”   R6   Ru   (   R   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRN     s    c         C   s5   |  j  } |  j  j r! |  j } n  |  j j | ƒ d S(   sN   unregister the ioloop event handler

        called once during close
        N(   RG   RS   RM   RH   t   remove_handler(   R   R‘   (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRU     s    	N(+   R>   R?   R   RI   RJ   RK   RG   R   Rp   RH   RM   RE   t   classmethodR2   RV   R/   R0   R@   RX   R}   R{   R[   R`   Ra   Rb   Rk   R   R   Rv   Ru   t   staticmethodR   R3   R4   R†   R   R”   RY   R‡   RŽ   R•   RN   RU   (    (    (    s*   lib/python2.7/site-packages/zmq/_future.pyRA   s   sD   		
	%		
#8	(	(					(   R   R   R	   R
   (   R@   t   collectionsR    R   t	   itertoolsR   t   zmqR   R   R   R/   R   t   PollerR   R0   RA   (    (    (    s*   lib/python2.7/site-packages/zmq/_future.pyt   <module>   s   \