o
    0 i7                     @   s  d 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	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ d
d  ZZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZedZedkZ e! Z"d'ddZ#d'd d!Z$d'd"d#Z%G d$d% d%Z&d%d&gZ'dS )(zzmq Socket class    N)SocketOption_OptType)ZMQError	_check_rc_check_version   )ffi)lib)Frame)_retry_sys_callc                 C   s   t d| S )Nzsize_t*)r   newlength r   c/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/zmq/backend/cffi/socket.py<lambda>   s    r   c                   C      t dtt dfS Nz	uint64_t*Zuint64_tr   r   nspsizeofr   r   r   r   new_uint64_pointer      r   c                   C   r   Nzint64_t*Zint64_tr   r   r   r   r   new_int64_pointer   r   r   c                   C   r   Nzint*intr   r   r   r   r   new_int_pointer   r   r   c                 C   s&   t d| ddtt d|  fS )Nchar[d]charr   r   r   r   r   new_binary_data!   s   &r"   c                 C      t d| t dfS r   r   r   r   valr   r   r   value_uint64_pointer%      r'   c                 C   r#   r   r$   r%   r   r   r   value_int64_pointer)   r(   r)   c                 C   r#   r   r$   r%   r   r   r   value_int_pointer-   r(   r*   c                 C   s(   t d|d dd| t d| fS )Nr   r   r   r    r!   r$   )r&   r   r   r   r   value_binary_data1   s   (r+   ZZMQ_FD_T   c                 C   sD   t | dtj}|tjkstr|tjkrt S |tjkrt|S t	 S N	_opt_type)
getattrr   r   int64ZMQ_FD_64BITfdr   bytesr"   r   )optionr   opt_typer   r   r   new_pointer_from_opt;   s   
r6   c                 C   sV   zt | } W n ty   tj}Y nw | j}|tjkr%t||d d  S t|d S )Nr   )r   
ValueErrorr   r   r.   r3   r   buffer)r4   Zopt_pointerr   r5   r   r   r   value_from_opt_pointerG   s   

r9   c                 C   sJ   t | dtj}|tjkstr|tjkrt|S |tjkr!t||S t	|S r-   )
r/   r   r   r0   r1   r2   r)   r3   r+   r*   )r4   valuer   r5   r   r   r   initialize_opt_pointerX   s   

r;   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd,ddZedd Zdd	 Zed
d Zd-ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd.ddZd/d!d"Zddd#d$ed%ed&efd'd(Zd0d*d+ZdS )1SocketNFr   c                 C   sr   |d u rt j}|| _|| _d  | _| _|r td|| _d| _	nd| _	t
|j|| _| jtjkr4t d| _d S )Nvoid *TF)zmqZCOPY_THRESHOLDcopy_thresholdcontext_draft_poller_draft_poller_ptrr   cast_zmq_socket_shadowCZ
zmq_socketZ_zmq_ctxNULLr   _closed)selfr@   socket_typeZshadowr?   r   r   r   __init__m   s   
zSocket.__init__c                 C   s   t td| jS )z+The address of the underlying libzmq socketZsize_t)r   r   rC   rD   rI   r   r   r   
underlying~   s   zSocket.underlyingc              
   C   st   | j rdS z	| tj W dS  ty9 } z|jtjkr&d| _ W Y d}~dS |jtjkr-n W Y d}~dS d}~ww )zthorough check of whether the socket has been closed,
        even if by another entity (e.g. ctx.destroy).

        Only used by the `closed` property.

        returns True if closed, False otherwise
        TNF)rH   getr>   ZTYPEr   errnoENOTSOCKZETERM)rI   er   r   r   _check_closed_deep   s    	
zSocket._check_closed_deepc                 C   s   |   S N)rR   rL   r   r   r   closed   s   zSocket.closedc                 C   s   d}| j s4t| dr4| jd urt| j}d  | _| _| jd ur1|d ur+| tj	| t
| j}d| _ |dk r>t| d S d S )Nr   rD   T)rH   hasattrrB   rF   Zzmq_poller_destroyrA   rD   setr>   ZLINGERZ	zmq_closer   )rI   Zlingerrcr   r   r   close   s   

zSocket.closec                 C   s   t |tr|d}n|}t |tr|d}t| j|}|dk rgtrDt	 t
jkrD|ddd }d| dt d}tt	 |d	t	 t
jkra|ddd }d
| d}tt	 |d	t| d S d S )Nutf8r   z://r   z
ipc path "z" is longer than z+ characters (sizeof(sockaddr_un.sun_path)).)msgz(No such file or directory for ipc path "z".)
isinstancestrencoder3   decoderF   Zzmq_bindrD   IPC_PATH_MAX_LENZ	zmq_errno	errno_modZENAMETOOLONGsplitr   ENOENTr   )rI   addressZ	address_brW   pathr[   r   r   r   bind   s$   


zSocket.bindc                 C   .   t |tr
|d}t| j|}t| d S NrY   )r\   r]   r^   rF   Z
zmq_unbindrD   r   rI   rd   rW   r   r   r   unbind      

zSocket.unbindc                 C   rg   rh   )r\   r]   r^   rF   Zzmq_connectrD   r   ri   r   r   r   connect   rk   zSocket.connectc                 C   rg   rh   )r\   r]   r^   rF   Zzmq_disconnectrD   r   ri   r   r   r   
disconnect   rk   zSocket.disconnectc                 C   s   d }t |trtdzt|}W n ty   tj}Y nw |j}t |tr6|tjkr2td| t	|}t
|||\}}ttj| j|td|| d S )Nzunicode not allowed, use bytesznot a bytes sockopt: void*)r\   r]   	TypeErrorr   r7   r   r   r.   r3   lenr;   r   rF   Zzmq_setsockoptrD   r   rC   )rI   r4   r:   r   r5   c_value_pointerZc_sizetr   r   r   rV      s*   




z
Socket.setc           
   
   C   s  zt |}W n ty   tj}Y nw |j}|tjkr7| jd ur7t|\}}t	
| jtd| t|d S t|dd\}}ztt	j| j||| W n ty } zt|t jkr|jtjjkr| t jrtdd tjsqtdtjtj dd	 td
| _t	  | jd< | _| jtj krd  | _| _ t	!| j| jtj tj"tj#B }t$| t	
| jtd|}t$| t|d W  Y d }~S  d }~ww |d }t%|||}	|tj j&kr|tj'kr|	(dr|	d d }	|	S )Nrn   r      r   )         z)draft socket FD support via zmq_poller_fdz'libzmq must be built with draft supportru   )
stacklevelzvoid*[1]r=       rZ   ))r   r7   r   r   r.   r>   ZFDrA   r6   rF   Zzmq_poller_fdr   rC   r   Zzmq_getsockoptrD   r   rO   ZErrnoEINVALrN   ZTHREAD_SAFEr   Z	DRAFT_APIRuntimeErrorwarningswarnerrorZDraftFDWarningr   rB   Zzmq_poller_newrG   Zzmq_poller_addPOLLINPOLLOUTr   r9   Z
ROUTING_IDr3   endswith)
rI   r4   r5   rq   _Zc_sizet_pointerrQ   rW   szvr   r   r   rN      sp   




#
z
Socket.getc                 C   s   t d}t|tst| }t d|}t|t|}t	| t
t||t| ttj|| j| t|}t	| dS )zSend a copy of a bufferable
zmq_msg_t*zchar[]N)r   r   r\   r3   
memoryviewtobytesrF   Zzmq_msg_init_sizerp   r   Zmemcpyzmq_msg_datar   zmq_msg_sendrD   zmq_msg_close)rI   bufflagszmq_msgZ	c_messagerW   Zrc2r   r   r   
_send_copy:  s   


zSocket._send_copyc                 C   s2   |  }|j}ttj|| j| |j}|  |S )z1Send a Frame on this socket in a non-copy manner.)Z	fast_copyr   r   rF   r   rD   trackerrX   )rI   framer   Z
frame_copyr   r   r   r   r   _send_frameI  s   zSocket._send_framec           	      C   s   t |tr	td|rt |ts| ||S d}t |tr)|r&|js&td|}n | jr?t|}|j	| jk r?| || t
jS t||| jd}d}| ||}|rU|  |S )Nz.Message must be in bytes, not a unicode objectFzNot a tracked message)trackr?   T)r\   r]   ro   r
   r   r   r7   r?   r   nbytesr>   Z_FINISHED_TRACKERr   rX   )	rI   datar   copyr   Zclose_framer   r   r   r   r   r   sendT  s(   


zSocket.sendTc           	      C   s   |rt d}t| n	tj|d}|j}zttj|| j	| W n t
y0   |r/t|  w |s5|S t t|t|}|d d  }t|}t| |S )Nr   )r   )r   r   rF   Zzmq_msg_initr>   r
   r   r   Zzmq_msg_recvrD   	Exceptionr   r8   r   Zzmq_msg_sizer   )	rI   r   r   r   r   r   _bufferZ_bytesrW   r   r   r   recvo  s&   


zSocket.recv)r   r   r   r   returnc               C   s   t |}|jstd|jrtd|dk rtd|d|j}|dkr(|}n||kr7td|d| dt|}tt	j
| j|||}t| |S )Nz%Can only recv_into contiguous buffersz Cannot recv_into readonly bufferr   znbytes=z must be non-negativez too big for memoryview of B)r   
contiguousBufferErrorreadonlyr7   r   r   Zfrom_bufferr   rF   Zzmq_recvrD   r   )rI   r8   r   r   viewZ
view_bytesZc_bufrW   r   r   r   	recv_into  s    
zSocket.recv_intorZ   c                 C   sD   |dk rt j}|du rtj}t|tr|d}t| j	|| dS )a   s.monitor(addr, flags)

        Start publishing socket events on inproc.
        See libzmq docs for zmq_monitor for details.

        Note: requires libzmq >= 3.2

        Parameters
        ----------
        addr : str
            The inproc url used for monitoring. Passing None as
            the addr will cause an existing socket monitor to be
            deregistered.
        events : int [default: zmq.EVENT_ALL]
            The zmq event bitmask for which events will be sent to the monitor.
        r   NrY   )
r>   Z	EVENT_ALLr   rG   r\   r]   r^   rF   Zzmq_socket_monitorrD   )rI   addreventsr   r   r   monitor  s   

zSocket.monitor)NNr   NrS   )r   FF)r   TF)rZ   )__name__
__module____qualname__r@   rJ   rD   rH   Z_refrE   rA   rB   r?   rK   propertyrM   rR   rT   rX   rf   rj   rl   rm   rV   rN   r   r   r   r   r   r   r   r   r   r   r   r<   b   s:    



G

r<   r`   )r   )(__doc__rO   ra   rz   r>   Zzmq.constantsr   r   Z	zmq.errorr   r   r   Z_cffir   r	   rF   messager
   utilsr   r   Znew_sizet_pointerr   r   r   r"   r'   r)   r*   r+   r   Z_fd_sizer1   Zget_ipc_path_max_lenr`   r6   r9   r;   r<   __all__r   r   r   r   <module>   s:    




  S