U
    Yc                     @   s6  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 deZejd	d
dZejd	ddZejdkreZneZG dd dZG dd deejZG dd deejZee_G dd de
je ZG dd deZdZdd Zde_dd Z dddddgZ!dS )z8AsyncIO support for zmq

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

    We automatically support proactor via tornado's AddThreadSelectorEventLoopN)__name__
__module____qualname____doc__ r   r   *lib/python3.8/site-packages/zmq/asyncio.pyr      s   r   )returnc                    s    t krt   S ttdrt tjrzddlm} W n tk
rR   tdY nX t	j
dtdd |  t  <  j fdd	}| _S  S d
S )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                      s    _ t d     d S N)closer   popr   asyncio_loopZ
loop_closeZselector_loopr   r   _close_selector_and_loopI   s    z7_get_selector_windows.<locals>._close_selector_and_loopN)r   hasattrasyncio
isinstancer   Ztornado.platform.asyncior   ImportErrorRuntimeErrorwarningswarnRuntimeWarningr   )r   r   r   r   r   r   _get_selector_windows   s.     

r"   c                 C   s   | S )zno-op on non-Windowsr   )loopr   r   r   _get_selector_noopV   s    r$   Zwin32c                   @   s$   e Zd ZeZejZejZ	dd Z
dS )_AsyncIOc                 C   sB   t jdkr:z
t W S  tk
r8   tjdtdd Y nX t S )N)      uO   No running event loop. zmq.asyncio should be used from within an asyncio loop.   r   )	sysversion_infor   Zget_running_loopr   r   r    r!   Zget_event_loopselfr   r   r   _default_loopf   s    

z_AsyncIO._default_loopN)r   r	   r
   r   Z_Future	selectorsZEVENT_WRITE_WRITEZ
EVENT_READ_READr-   r   r   r   r   r%   a   s   r%   c                   @   s    e Zd ZdZdd Zdd ZdS )Pollerz1Poller returning asyncio.Future for poll results.c                    sH   t |}|| j@ r&|| fdd || j@ rD|| fdd dS )z"Schedule callback for a raw socketc                     s     S r   r   argsfr   r   <lambda>{       z*Poller._watch_raw_socket.<locals>.<lambda>c                     s     S r   r   r2   r4   r   r   r6   }   r7   N)_get_selectorr0   
add_readerr/   Z
add_writer)r,   r#   socketZevtr5   selectorr   r4   r   _watch_raw_socketw   s
    

zPoller._watch_raw_socketc                 G   s*   t |}|D ]}|| || qdS )z$Unschedule callback for a raw socketN)r8   remove_readerZremove_writer)r,   r#   Zsocketsr;   r:   r   r   r   _unwatch_raw_sockets   s    
zPoller._unwatch_raw_socketsN)r   r	   r
   r   r<   r>   r   r   r   r   r1   t   s   r1   c                   @   s0   e Zd ZdZeZd	ddZd
ddZdd ZdS )Socketz<Socket returning asyncio Futures for send/recv/poll methods.Nc                 C   s   |d kr|   }t|S r   )Z	_get_loopr8   r,   Zio_loopr   r   r   r8      s    zSocket._get_selectorc                    s      | j fdd dS )z#initialize the ioloop event handlerc                      s     ddS )Nr   )Z_handle_eventsr   r+   r   r   r6      r7   z'Socket._init_io_state.<locals>.<lambda>N)r8   r9   _fdr@   r   r+   r   _init_io_state   s    
 
zSocket._init_io_statec                 C   s2   | j }|r.| s.| jdkr.| || j dS )zEclear any ioloop event handler

        called once at close
        N)Z_current_loopZ	is_closedrA   r8   r=   )r,   r#   r   r   r   _clear_io_state   s    zSocket._clear_io_state)N)N)	r   r	   r
   r   r1   Z_poller_classr8   rB   rD   r   r   r   r   r?      s
   

r?   c                   @   s   e Zd ZdZeZdZdS )Contextz/Context for creating asyncio-compatible SocketsN)r   r	   r
   r   r?   _socket_classZ	_instancer   r   r   r   rE      s   rE   c                       s"   e Zd ZdZd fdd	Z  ZS )ZMQEventLoopz}DEPRECATED: AsyncIO eventloop using zmq_poll.

    pyzmq sockets should work with any asyncio event loop as of pyzmq 17.
    Nc                    s   t   t |S r   )_deprecatedsuper__init__)r,   r;   	__class__r   r   rJ      s    zZMQEventLoop.__init__)N)r   r	   r
   r   rJ   __classcell__r   r   rK   r   rG      s   rG   c                   C   s$   t jr
d S dt _tjdtdd d S )NTzsZMQEventLoop and zmq.asyncio.install are deprecated in pyzmq 17. Special eventloop integration is no longer needed.r&   r   )rH   calledr   r    DeprecationWarningr   r   r   r   rH      s    rH   Fc                   C   s
   t   dS )z(DEPRECATED: No longer needed in pyzmq 17N)rH   r   r   r   r   install   s    rP   )"r   r   r.   r)   r   r   r   weakrefr   ZzmqZ_zmqr   r   __annotations__r!   r   ZAbstractEventLoopr"   r$   platformr8   r%   Z_AsyncPollerr1   Z_AsyncSocketr?   rF   rE   rG   Z_looprH   rN   rP   __all__r   r   r   r   <module>   s@   9
	