
    Ef                        U d 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	Z
ddl	mZ  e       Zeed<    G d de      Zd	ej                   fd
Zd	ej                   fdZej&                  dk(  reZneZ G d d      Z G d deej,                        Z G d deej0                        Zee_         G d de
j6                  e         Z G d de      ZdZd Zde_        d Z g dZ!y)z8AsyncIO support for zmq

Requires asyncio and Python 3.
    N)FutureSelectorEventLoop)WeakKeyDictionary)_future
_selectorsc                       e Zd ZdZy)ProactorSelectorThreadWarningzWarning class for notifying about the extra thread spawned by tornado

    We automatically support proactor via tornado's AddThreadSelectorEventLoopN)__name__
__module____qualname____doc__     -/usr/lib/python3/dist-packages/zmq/asyncio.pyr	   r	      s    Rr   r	   returnc                 R     t         v r	t             S t        t        d      rjt         t        j                        rP	 ddlm} t        j                  dt        d        |       xt          <    j                   fd}| _        S  S # t        $ r t        d      w xY w)	zGet selector-compatible loop

    Returns an object with ``add_reader`` family of methods,
    either the loop itself or a SelectorThread instance.

    Workaround Windows proactor removal of
    *reader methods, which we need for zmq sockets.
    ProactorEventLoopr   )AddThreadSelectorEventLoopa  Proactor event loop does not implement add_reader family of methods required for zmq. zmq will work with proactor if tornado >= 6.1 can be found. Use `asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())` or install 'tornado>=6.1' to avoid this error.a   Proactor event loop does not implement add_reader family of methods required for zmq. Registering an additional selector thread for add_reader support via tornado. Use `asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())` to avoid this warning.   
stacklevelc                  `     _         t        j                   d        j                          y N)closer   pop)asyncio_loop
loop_closeselector_loops   r   _close_selector_and_loopz7_get_selector_windows.<locals>._close_selector_and_loopI   s'     ",LNN<.!r   )r   hasattrasyncio
isinstancer   tornado.platform.asyncior   ImportErrorRuntimeErrorwarningswarnRuntimeWarningr   )r   r   r   r   r   s   `  @@r   _get_selector_windowsr)      s     z!,'' w+,g//2	K 	& 	
 4Nl3[[
<0 "''
	" 6C  	B 	s    B B&c                     | S )zno-op on non-Windowsr   )loops    r   _get_selector_noopr,   V   s    Kr   win32c                   F    e Zd ZeZej                  Zej                  Z	d Z
y)_AsyncIOc                     t         j                  dk\  r	 t        j                         S t        j                         S # t        $ r2 t        j                  dt        d       Y t        j                         S w xY w)N)      uO   No running event loop. zmq.asyncio should be used from within an asyncio loop.   r   )	sysversion_infor!   get_running_loopr%   r&   r'   r(   get_event_loopselfs    r   _default_loopz_AsyncIO._default_loopf   sl    v%//11 %%''   e"  %%''s   = %A87A8N)r
   r   r   r   _Future	selectorsEVENT_WRITE_WRITE
EVENT_READ_READr:   r   r   r   r/   r/   a   s"    G""F  E(r   r/   c                       e Zd ZdZd Zd Zy)Pollerz1Poller returning asyncio.Future for poll results.c                     t        |      }|| j                  z  r|j                  |fd       || j                  z  r|j	                  |fd       yy)z"Schedule callback for a raw socketc                              S r   r   argsfs    r   <lambda>z*Poller._watch_raw_socket.<locals>.<lambda>{   	    ac r   c                              S r   r   rE   s    r   rH   z*Poller._watch_raw_socket.<locals>.<lambda>}   rI   r   N)_get_selectorr@   
add_readerr>   
add_writer)r9   r+   socketevtrG   selectors       ` r   _watch_raw_socketzPoller._watch_raw_socketw   sL     &(9:(9: r   c                 l    t        |      }|D ]$  }|j                  |       |j                  |       & y)z$Unschedule callback for a raw socketN)rK   remove_readerremove_writer)r9   r+   socketsrP   rN   s        r   _unwatch_raw_socketszPoller._unwatch_raw_sockets   s7     & 	+F""6*""6*	+r   N)r
   r   r   r   rQ   rV   r   r   r   rB   rB   t   s    ;;+r   rB   c                   *    e Zd ZdZeZddZddZd Zy)Socketz<Socket returning asyncio Futures for send/recv/poll methods.Nc                 <    || j                         }t        |      S r   )	_get_looprK   r9   io_loops     r   rK   zSocket._get_selector   s    ?nn&GW%%r   c                 b      j                  |      j                   j                   fd       y)z#initialize the ioloop event handlerc                  (     j                  dd      S )Nr   )_handle_eventsr8   s   r   rH   z'Socket._init_io_state.<locals>.<lambda>   s    d11!Q7 r   N)rK   rL   _fdr[   s   ` r   _init_io_statezSocket._init_io_state   s&    7#..HH7	
r   c                     | j                   }|rL|j                         s;| j                  dk7  r+| j                  |      j	                  | j                         yyyy)zEclear any ioloop event handler

        called once at close
        N)_current_loop	is_closedr`   rK   rS   )r9   r+   s     r   _clear_io_statezSocket._clear_io_state   sL    
 !!(TXX^t$22488< .<(4r   r   )	r
   r   r   r   rB   _poller_classrK   ra   rf   r   r   r   rX   rX      s    FM&

=r   rX   c                       e Zd ZdZeZdZy)Contextz/Context for creating asyncio-compatible SocketsN)r
   r   r   r   rX   _socket_class	_instancer   r   r   ri   ri      s    9M Ir   ri   c                   $     e Zd ZdZd fd	Z xZS )ZMQEventLoopz}DEPRECATED: AsyncIO eventloop using zmq_poll.

    pyzmq sockets should work with any asyncio event loop as of pyzmq 17.
    c                 6    t                t        | 	  |      S r   )_deprecatedsuper__init__)r9   rP   	__class__s     r   rq   zZMQEventLoop.__init__   s    w))r   r   )r
   r   r   r   rq   __classcell__)rr   s   @r   rm   rm      s    
* *r   rm   c                  t    t         j                  ry dt         _        t        j                  dt        d       y )NTzsZMQEventLoop and zmq.asyncio.install are deprecated in pyzmq 17. Special eventloop integration is no longer needed.r1   r   )ro   calledr&   r'   DeprecationWarningr   r   r   ro   ro      s+    KMM}r   Fc                      t                y)z(DEPRECATED: No longer needed in pyzmq 17N)ro   r   r   r   installrx      s    Mr   )ri   rX   rB   rm   rx   )"r   r!   r<   r4   r&   r   r   weakrefr   zmq_zmqr   r   __annotations__r(   r	   AbstractEventLoopr)   r,   platformrK   r/   _AsyncPollerrB   _AsyncSocketrX   rj   ri   rm   _loopro   ru   rx   __all__r   r   r   <module>r      s      
  - %   !2 3
 3RN R66r 9 9 
 <<7)M&M( (&+Xw++ +&=Xw++ =4  dll6" *$ * 		  
r   