o
    پiH"                     @   s0  d dl Z d dlZd dlZd dl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
Z
d dlZd dlZeeZd&dedefddZded	ed
efddZded
efddZdd Zdd Z	d'dejdejdededed
eejef fddZe	ddd
efddZd d! Ze Z d(ded#ed
efd$d%Z!dS ))    N)	lru_cacheTinclude_parentskip_pidc              	   C   s   t  t  u rttjtj | du rt } d}zt	| }W n tj
y,   Y dS w |jdd}|D ]}|j|kr=q5z|  W q5 tj
yM   Y q5w |rxz| t kr`|  td |  |tj W dS  tj
yw   Y dS w dS )z-Kill the process and all its child processes.NFT)	recursiver   )	threadingcurrent_threadmain_threadsignalSIGCHLDSIG_DFLosgetpidpsutilProcessNoSuchProcesschildrenpidkillsysexitsend_signalSIGQUIT)
parent_pidr   r   itselfr   child r   ^/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/runtime/utils/common.pykill_process_tree   s<   

r   nameprefixreturnc                 C   s   |s| S | d|  S )a  Add a weight path prefix to a module name.

    Args:
        name: base module name.
        prefix: weight prefix str to added to the front of `name` concatenated with `.`.

    Returns:
        The string `prefix.name` if prefix is non-empty, otherwise just `name`.
    .r   )r   r   r   r   r   
add_prefix<   s   
r"   addressc                 C   s&   zt |  W dS  ty   Y dS w )NTF)	ipaddressIPv6Address
ValueError)r#   r   r   r   is_valid_ipv6_addressI   s   
r'   c                 C   s   | }| d}|dkrtd|d |d  }t|d| s&td| d }t||d krE||d  dkrA||d d  }ntd|sKtd	z	t|}W ||fS  tyc   td
| dw )N]z(invalid IPv6 address format: missing ']'   zinvalid IPv6 address: :   z4received IPv6 address format: expected ':' after ']'z>a port must be specified in IPv6 address (format: [ipv6]:port)zinvalid port in IPv6 address: '')findr&   r'   lenint)dist_init_addraddrendhostport_strportr   r   r   configure_ipv6Q   s,   

r7   c              	   C   s   t  t jt j@}z|t jt jd |d| f |d W W d   dS  t jy8   Y W d   dS  t	yG   Y W d   dS w 1 sKw   Y  dS )z#Return whether a port is available.r*    NTF)
socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindlistenerrorOverflowError)r6   sr   r   r   is_port_availableq   s   
rD   
   contextsocket_typeendpointr?   max_bind_retriesc                    sp  t  }|jd }|jd }|dkr|dkrtd nd | ||ddkr0tj	d  fdd	} fd
d}	|tj
krG|  n#|tjkrP|	  n|tjtjtjtjfv rc|  |	  ntd| |r/ddl}
|
d|}|r&|dkr&t|d}d}t|D ]}zQ|}|dkr||d  }|
dd| |}td||d d   d| d|d  d| d	 | |dkrtd| d|d  d| d |fW   S  tjy } z/|}|jtjkr||d k rW Y d}~q||d krtd| d| d||d      d}~ww |r"||fS | |fS | |fS )a  
    Create and configure a ZMQ socket.

    Args:
        context: ZMQ context
        socket_type: Type of ZMQ socket
        endpoint: Endpoint string (e.g., "tcp://localhost:5555")
        bind: Whether to bind (True) or connect (False)
        max_bind_retries: Maximum number of retries if bind fails due to address already in use

    Returns:
        A tuple of (socket, actual_endpoint). The actual_endpoint may differ from the
        requested endpoint if bind retry was needed.
    i   @       g      Ar)   [r*   c                           tjd  tj  d S Nr   )r<   zmqSNDHWMSNDBUFr   buf_sizer9   r   r   set_send_opt      z$get_zmq_socket.<locals>.set_send_optc                      rM   rN   )r<   rO   RCVHWMRCVBUFr   rR   r   r   set_recv_opt   rU   z$get_zmq_socket.<locals>.set_recv_optzUnsupported socket type: r   Nz:(\d+)$*   r+   zZMQ bind failed for port z, retrying with port z
 (attempt /)z!Successfully bound ZMQ socket to z after z attempts. Original port z was unavailable.z Failed to bind ZMQ socket after z attempts. Original endpoint: z, Last tried port: )r   virtual_memorytotal	availabler0   r9   r.   r<   rO   IPV6PUSHPULLDEALERREQREPROUTERr&   researchgrouprangesubloggerinfor?   warningZMQErrorerrno
EADDRINUSErA   connect)rF   rG   rH   r?   rI   mem	total_memavailable_memrT   rX   rf   
port_matchoriginal_portlast_exceptionattemptcurrent_endpointcurrent_porter   rR   r   get_zmq_socket   s   







	

r|   r*   )maxsizec                  C   s(   t   } | dv ottdotj S )N)x86_64amd64i386i686cpu)platformmachinelowerhasattrtorchr   is_available)r   r   r   r   is_host_cpu_x86   s   r   c                  C   sB   t j } | d  d| d  }| |dkrdnd tjd< d S )Nr   r!   r*   z9.0z+PTXr8   TORCH_CUDA_ARCH_LIST)r   cudaget_device_capabilityr   environ)
capabilityarchr   r   r   set_cuda_arch  s   
"r   falsedefaultc                 C   sn   t | |}t|  }h d}h d}||vr3||vr3|tvr.td|  d| d t| ||v S )N>   1tyonyestrue>   r8   0fnnooffr   zget_bool_env_var(z) see non-understandable value=z and treat as false)	r   getenvstrstripr   _warned_bool_env_var_keysrk   rm   add)r   r   valuetruthy_valuesfalsy_valuesr   r   r   get_bool_env_var  s   
r   )TN)rE   )r   )"r$   loggingr   r   r	   r9   r   r   	functoolsr   r   r   rO   	getLogger__name__rk   boolr0   r   r   r"   r'   r7   rD   Context
SocketTypetupleSocketr|   r   r   setr   r   r   r   r   r   <module>   sJ   
' 
v