
    Mh,                    
   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 ddl	m
Z
 ddlZddlmZ ddlmZ dd	lmZ  eed
          rej        ej        fZded<   ndZd Z G d de          Z G d dee                   ZdS )ziThis module wraps the :class:`Socket` and :class:`Context` found in :mod:`pyzmq <zmq>` to be non blocking    )annotationsN)AsyncResult)get_hub)Context)Socket   )_PollerRCVTIMEOtupleTIMEOS c                z    	 |                                   dS # t          $ r |                                  Y dS w xY w)zNsimple wrapper for stopping an Event, allowing for method rename in gevent 1.0N)stopAttributeErrorcancel)evts    N/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/zmq/green/core.py_stopr   #   sF    




   

s    ::c                       e Zd ZdZdZdZdZdZdZdZ	dZ
eZdZ fdZd Zd fd	Zd	 Zd
 Zd fd	Zd Zd Zd fd	Zd fd	Zddd fd
Z fdZ fdZ fdZ fdZ xZS )_SocketaK  Green version of :class:`zmq.Socket`

    The following methods are overridden:

        * send
        * recv

    To ensure that the ``zmq.NOBLOCK`` flag is set and that sending or receiving
    is deferred to the hub if a ``zmq.EAGAIN`` (retry) error is raised.

    The `__state_changed` method is triggered when the zmq.FD for the socket is
    marked as readable and triggers the necessary read and write events (which
    are waited for in the recv and send methods).

    Some double underscore prefixes are used to minimize pollution of
    :class:`zmq.Socket`'s namespace.
    FNg333333'@zzmq.green.Socketc                ~     t                      j        |i | d| _        d| _        |                                  d S )NF)super__init___Socket__in_send_multipart_Socket__in_recv_multipart_Socket__setup_events)selfakw	__class__s      r   r   z_Socket.__init__I   sG    !"r"""#( #(     c                .    |                                   d S N)closer   s    r   __del__z_Socket.__del__O   s    

r!   c                r    t                                          |           |                                  d S r#   )r   r$   _Socket__cleanup_events)r   lingerr    s     r   r$   z_Socket.closeR   s1    fr!   c                    t          | dd           rt          | j                   d | _        | j                                         | j                                         d S )N_state_event)getattrr   r+   _Socket__writableset_Socket__readabler%   s    r   __cleanup_eventsz_Socket.__cleanup_eventsV   s]    4.. 	%$#$$$ $Dr!   c                    t                      | _        t                      | _        | j                                         | j                                         	 t	                      j                            |                     t          j	                  d          | _
        | j
                            | j                   d S # t          $ r? ddlm}  ||                     t          j	                  | j        d          | _
        Y d S w xY w)Nr   r   )
read_eventT)persist)r   r/   r-   r.   r   loopio
getsockoptzmqFDr+   start_Socket__state_changedr   gevent.corer2   )r   r2   s     r   __setup_eventsz_Socket.__setup_events_   s    %--%--	 '		 1 1''! !D ##D$899999 	 	 	...... *
'')=t! ! !D		s   A(C ADDc                   | j         r|                                  d S 	 t                                          t          j                  }|t          j        z  r| j                                         |t          j	        z  r| j
                                         d S d S # t          j        $ r?}| j                            |           | j
                            |           Y d }~d S d }~ww xY wr#   )closedr(   r   r6   r7   EVENTSPOLLOUTr-   r.   POLLINr/   ZMQErrorset_exception)r   event_evtypeeventsexcr    s        r   __state_changedz_Socket.__state_changedr   s    ; 	!!###F
	&WW''
33F
 # &##%%%
" &##%%%%%& & | 	/ 	/ 	/O))#...O))#.........	/s   +B C-.4C((C-c                2   | j                                         s
J d            t                      | _         t          j                    }| j        }|rt          j        |          }nd }	 |r|                                 | j                             d           n# t
          j        $ r}||ur t          j                    }| j	        r[|rY||z
  |k    rP| 
                    t          j                  t          j        z  r$t          d| j         dt           j                   Y d }~nd }~ww xY w|r|                                 | j                                          d S # |r|                                 | j                                          w xY w)N.Only one greenlet can be waiting on this eventsecondsTblockz3BUG: gevent may have missed a libzmq send event on !file)r-   readyr   time_gevent_bug_timeoutgeventTimeoutr9   get_debug_geventr6   r7   r?   r@   printr8   sysstderrr$   r.   r   ticdttimeoutttocs         r   _wait_writez_Socket._wait_write   s   $$&&XX(XXXX%-- ikk% 	nR000GGG	"  Od++++~ 	 	 	)++C "		 #INNOOCJ//#+= # T$'TTT   	"   O!!!!!   O!!!!1   ,1B E% D1-A:D,'E% ,D11E% %1Fc                2   | j                                         s
J d            t                      | _         t          j                    }| j        }|rt          j        |          }nd }	 |r|                                 | j                             d           n# t
          j        $ r}||ur t          j                    }| j	        r[|rY||z
  |k    rP| 
                    t          j                  t          j        z  r$t          d| j         dt           j                   Y d }~nd }~ww xY w|r|                                 | j                                          d S # |r|                                 | j                                          w xY w)NrJ   rK   TrM   z3BUG: gevent may have missed a libzmq recv event on rO   rP   )r/   rR   r   rS   rT   rU   rV   r9   rW   rX   r6   r7   r?   rA   rY   r8   rZ   r[   r$   r.   r\   s         r   
_wait_readz_Socket._wait_read   s   $$&&XX(XXXX%--
 ikk% 	nR000GGG	"  Od++++~ 	 	 	)++C "		 #INNOOCJ//#*< # T$'TTT   	"   O!!!!!   O!!!!rc   r   Tc                D   |t           j        z  r]	  t                      j        ||||fi |}| j        s|                                  n!# | j        s|                                  w w xY w|S |t           j        z  }	 	 t                                          ||||          }| j        s|                                  |S # t           j        $ r;}|j        t           j        k    r| j        s|                                   Y d}~nd}~ww xY w| 	                                 )zsend, which will only block current greenlet

        state_changed always fires exactly once (success or fail) at the
        end of this method.
        TN)
r7   NOBLOCKr   sendr   r:   rB   errnoEAGAINrb   )	r   dataflagscopytrackkwargsmsger    s	           r   rh   z_Socket.send   s[    3; 	+"eggl4eFFvFF/ +((*** / +((****+J	ggll4e<< / +((***
 <   7cj((3 /,,... )(((( 	s#   A A)?$C   D
1DD
c                N   |t           j        z  rc	 t                                          |||          }| j        s|                                  n!# | j        s|                                  w w xY w|S |t           j        z  }	 	 t                                          |||          }| j        s|                                  |S # t           j        $ r;}|j        t           j        k    r| j        s|                                   Y d}~nd}~ww xY w| 	                                 )zrecv, which will only block current greenlet

        state_changed always fires exactly once (success or fail) at the
        end of this method.
        TN)
r7   rg   r   recvr   r:   rB   ri   rj   re   )r   rl   rm   rn   rp   rq   r    s         r   rs   z_Socket.recv   sM    3; 	+ggll5$66/ +((*** / +((****+J	
ggll5$66 / +((***
 <   7cj((3 /,,... )(((( OO	s#   #A A/#C D1D

Dnbytesrl   c                 |t           j        z  r$t                                          |||          S |t           j        z  }	 	 t                                          |||          }|                                  |S # t           j        $ r4}|j        t           j        k    r|                                   Y d}~nd}~ww xY w|                                  )z1recv_into, which will only block current greenletrt   TN)	r7   DONTWAITr   	recv_intor:   rB   ri   rj   re   )r   bufferru   rl   recvdrq   r    s         r   rx   z_Socket.recv_into  s    3< 	I77$$VF%$HHH
	))&u)MM $$&&& <   7cj((((*** )(((( OO
	s   $B   C*B>>Cc                    d| _         	  t                      j        |i |}d| _         |                                  n # d| _         |                                  w xY w|S )zAwrap send_multipart to prevent state_changed on each partial sendTF)r   r   send_multipartr:   r   argsro   rp   r    s       r   r|   z_Socket.send_multipart  p    #' 	#(%''($9&99C',D$  """" (-D$  """"
	   ? Ac                    d| _         	  t                      j        |i |}d| _         |                                  n # d| _         |                                  w xY w|S )zAwrap recv_multipart to prevent state_changed on each partial recvTF)r   r   recv_multipartr:   r}   s       r   r   z_Socket.recv_multipart&  r   r   c                    |t           v rt          j        dt                     t	                                          |          }|t          j        k    r|                                  |S )z+trigger state_changed on getsockopt(EVENTS)0TIMEO socket options have no effect in zmq.green)	r   warningswarnUserWarningr   rW   r7   r?   r:   )r   optoptvalr    s      r   rW   z_Socket.get0  s`    &==MBK   S!!#*  """r!   c                    |t           v rt          j        dt                     t	                                          ||          S )zset socket optionr   )r   r   r   r   r   r.   )r   r   valr    s      r   r.   z_Socket.set;  s?    &==MBK   ww{{3$$$r!   r#   )NN)r   TF)__name__
__module____qualname____doc__r   r   r-   r/   r+   rT   rX   r	   _poller_class	_repr_clsr   r&   r$   r(   r   r:   rb   re   rh   rs   rx   r|   r   rW   r.   __classcell__)r    s   @r   r   r   ,   s        $  JJLMM"I                     && & & & & & "" "" ""H$" $" $"L           D     : ./a       "        	 	 	 	 	% % % % % % % % %r!   r   c                      e Zd ZdZeZdZdZdS )_ContextzrReplacement for :class:`zmq.Context`

    Ensures that the greened Socket above is used in calls to `socket`.
    zzmq.green.ContextN)r   r   r   r   r   _socket_classr   	_instancer   r!   r   r   r   D  s+         
 M#I IIIr!   r   )r   
__future__r   rZ   rS   r   rU   gevent.eventr   
gevent.hubr   r7   r   _original_Contextr   _original_Socketpollr	   hasattrr
   SNDTIMEOr   __annotations__r   r   r   r   r!   r   <module>r      s]   p o o " " " " " " 



    $ $ $ $ $ $       



 , , , , , , * * * * * *      
73
 \3<0F00000F  U% U% U% U% U% U% U% U%p
 
 
 
 
 ) 
 
 
 
 
r!   