
    fz                       U d Z ddlm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ded<    G d	 d
e      Z	 	 ddZd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j2                        Zee_         G d dej8                  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.
    )annotationsN)FutureSelectorEventLoop)WeakKeyDictionary)_futurer   
_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__     F/var/www/cvtools/html/venv/lib/python3.12/site-packages/zmq/asyncio.pyr
   r
      s    Rr   r
   c                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_loopM   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+,!!2	K 	& 	
 4N4
 	

<0
 "''
	" 6G  	B 	s    B B&c                    | S )zno-op on non-Windowsr   )loops    r   _get_selector_noopr,   Z   s    Kr   win32c                  F    e Zd ZeZej                  Zej                  Z	d Z
y)_AsyncIOc                    	 t        j                         S # t        $ r2 t        j                  dt
        d       Y t        j                         S w xY w)NuO   No running event loop. zmq.asyncio should be used from within an asyncio loop.   r   )r!   get_running_loopr%   r&   r'   r(   get_event_loopselfs    r   _default_loopz_AsyncIO._default_loopj   sK    	++-- 	MMa %%''	s    %AAN)r   r   r   r   _Future	selectorsEVENT_WRITE_WRITE
EVENT_READ_READr6   r   r   r   r/   r/   e   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   rA   s    r   rD   z*Poller._watch_raw_socket.<locals>.<lambda>   rE   r   N)_get_selectorr<   
add_readerr:   
add_writer)r5   r+   socketevtrC   selectors       ` r   _watch_raw_socketzPoller._watch_raw_socketz   sL     &(9:(9: r   c                l    t        |      }|D ]$  }|j                  |       |j                  |       & y)z$Unschedule callback for a raw socketN)rG   remove_readerremove_writer)r5   r+   socketsrL   rJ   s        r   _unwatch_raw_socketszPoller._unwatch_raw_sockets   s7     & 	+F""6*""6*	+r   N)r   r   r   r   rM   rR   r   r   r   r>   r>   w   s    ;;+r   r>   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_looprG   r5   io_loops     r   rG   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_eventsr4   s   r   rD   z'Socket._init_io_state.<locals>.<lambda>   s    d11!Q7 r   N)rG   rH   _fdrW   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\   rG   rO   )r5   r+   s     r   _clear_io_statezSocket._clear_io_state   sL    
 !!(TXX^t$22488< .<(4r   r   )	r   r   r   r   r>   _poller_classrG   r]   rb   r   r   r   rT   rT      s    FM&

=r   rT   c                      e Zd ZdZeZdZy)Contextz/Context for creating asyncio-compatible SocketsN)r   r   r   r   rT   _socket_class	_instancer   r   r   re   re      s    9M Ir   re   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__)r5   rL   	__class__s     r   rm   zZMQEventLoop.__init__   s    w))r   r   )r   r   r   r   rm   __classcell__)rn   s   @r   ri   ri      s    
* *r   ri   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.   r   )rk   calledr&   r'   DeprecationWarningr   r   r   rk   rk      s+    KMM}r   Fc                     t                y)z(DEPRECATED: No longer needed in pyzmq 17N)rk   r   r   r   installru      s    Mr   )re   rT   r>   ri   ru   )returnzasyncio.AbstractEventLoop)#r   
__future__r   r!   r8   sysr&   r   r   weakrefr   zmq_zmqr   r   __annotations__r(   r
   r)   r,   platformrG   r/   _AsyncPollerr>   _AsyncSocketrT   rf   re   ri   _looprk   rr   ru   __all__r   r   r   <module>r      s    #   
  - %   !2 3
 3RN R99x
 <<7)M&M( ($+Xw++ +&=Xw++ =4  dll6" *$ * 		  
r   