o
    * i	                     @   sJ   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 G dd dZdS )    N)closing   )Devicec                   @   sT   e Zd Zdd Zdd ZdddZd	d
 ZdddZdd Zdd Z	e
dd ZdS )Nodec                 C   sh   t  | _|  | _g | _g | _tdd}|	d}t
|d | _t
|d | _t| j| j| _d S )NZ
PORT_RANGEz35100:64000:r   r   )r   Zparse_devicedeviceget_host_ipip
free_portsZ_allocated_portsosgetenvsplitint_port_start	_port_endrandomrandint	_port_cur)selfZ
port_range r   r/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/distributed/launch/context/node.py__init__   s   


zNode.__init__c                 C   s4   zt  | _t t | j| _| jW S    Y dS )Nz	127.0.0.1)socketgethostnamehostnamegethostbynamegetfqdnr	   r   r   r   r   r   &   s   
zNode.get_host_ipr   r   c                    sv   t jdd u r fddt|D }  j|7  _|S tt jd}tt|| || | d}  j|7  _|S )NZFLAGS_FIXED_PORTc                    s   g | ]}   qS r   )get_free_port).0ir   r   r   
<listcomp>0   s    z'Node.get_free_ports.<locals>.<listcomp>r   )r   environgetranger
   r   list)r   nZrankr
   Z
start_portr   r   r   get_free_ports.   s   zNode.get_free_portsc                 C   s   | j S )N)r
   r   r   r   r   get_ports_occupied:   s   zNode.get_ports_occupiedc              
   C   s   t ttjtj1}|tjtjtddd z|	d|f |
 d W W  d    S    Y W d    dS 1 s>w   Y  d S )Niir   r    )r   r   AF_INETSOCK_STREAM
setsockopt
SOL_SOCKET	SO_LINGERstructpackbindgetsockname)r   portsr   r   r   _get_free_port=   s   $zNode._get_free_portc                 C   s*   |  j d7  _ | j | jkr| j| _ d S d S )Nr   )r   r   r   r   r   r   r   _update_port_curH   s   zNode._update_port_curc                 C   s@   t dD ]}| | j}|dkr|   |  S |   q| jS )Nd   r   )r$   r7   r   r8   )r   _retr   r   r   r   M   s   
zNode.get_free_portc                 C   s   t ttjtj.}ttdr|tjtjd ||t	|f}|dkr/	 W d    dS 	 W d    dS 1 s;w   Y  d S )NSO_REUSEPORTr   r   TF)
r   r   r,   r-   hasattrr.   r/   r<   
connect_exr   )r   r	   r5   sockresultr   r   r   is_server_readyX   s   
	$zNode.is_server_readyN)r   r   )r   )__name__
__module____qualname__r   r   r'   r(   r7   r8   r   classmethodrA   r   r   r   r   r      s    

r   )	r   r   r   r1   
contextlibr   r   r   r   r   r   r   r   <module>   s   