o
    Zh                      @   s  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m	Z	m
Z
 d dlmZmZmZmZ dgZdedeeef fdd	Zd
edee fddZdee dedeeef fddZdedefddZdeeeeef f ddfddZG dd dZdS )    N)	timedelta)EventThread)AnyCallableOptionalUnionparse_rendezvous_endpoint
config_strreturnc                 C   s   i }|   } | s
|S | d}|D ]-}|dd^}}|  }|s%td|r.|d   }nd}|s:td| d|||< q|S )	zExtract key-value pairs from a rendezvous configuration string.

    Args:
        config_str:
            A string in format <key1>=<value1>,...,<keyN>=<valueN>.
    ,=   zZThe rendezvous configuration string must be in format <key1>=<value1>,...,<keyN>=<valueN>.r   Nz%The rendezvous configuration option 'z' must have a value specified.)stripsplit
ValueError)r
   config
key_valueskvkeyvaluesvalue r   Y/var/www/auris/lib/python3.10/site-packages/torch/distributed/elastic/rendezvous/utils.py_parse_rendezvous_config   s*   


r   port_strc                 C   s   | rt d| rt| S dS )z1Try to extract the port number from ``port_str``.z^[0-9]{1,5}$N)rematchint)r   r   r   r   _try_parse_port<   s   r   endpointdefault_portc                 C   s   | dur|   } | sd|fS | d dkr#| d dkr#| gg R ^}}n| dd^}}t|dkrC|d dkrC|d dkrC|dd }t|dkr`t|d }|du sW|d	kr_td
|  dn|}td|sptd|  d||fS )a4  Extract the hostname and the port number from a rendezvous endpoint.

    Args:
        endpoint:
            A string in format <hostname>[:<port>].
        default_port:
            The port number to use if the endpoint does not include one.

    Returns:
        A tuple of hostname and port number.
    N	localhostr   []:r   i   z,The port number of the rendezvous endpoint 'z)' must be an integer between 0 and 65536.z^[\w\.:-]+$z)The hostname of the rendezvous endpoint 'zN' must be a dot-separated list of labels, an IPv4 address, or an IPv6 address.)r   rsplitlenr   r   r   r   )r    r!   hostrestportr   r   r   r	   C   s,   $

r)   c              
   C   s  | dkrdS zt | }W n ty   d}Y nw |r |jr dS ztj| dtjtjd}W n ttjfyD } zg }W Y d}~nd}~ww dd |D }t	 }| |krVdS tj|dtjtjd}|D ])}|d rr|d | krr dS |r|d d	 t
|kr dS |d d	 |v r dS qcd
S )a<  Indicate whether ``host`` matches the hostname of this machine.

    This function compares ``host`` to the hostname as well as to the IP
    addresses of this machine. Note that it may return a false negative if this
    machine has CNAME records beyond its FQDN or IP addresses assigned to
    secondary NICs.
    r"   TN)protoflagsc                 S   s   g | ]}|d  d qS )   r   r   ).0Zhost_addr_infor   r   r   
<listcomp>   s    z-_matches_machine_hostname.<locals>.<listcomp>   r.   r   F)	ipaddress
ip_addressr   is_loopbacksocketgetaddrinfoIPPROTO_TCPAI_CANONNAMEgaierrorgethostnamestr)r)   addrZhost_addr_list_Zhost_ip_listZ	this_hostZ	addr_list	addr_infor   r   r   _matches_machine_hostnamet   sB   

r?   secondsc                 C   s.   t | tr
tj|  } | dkrt|  dS dS )zSuspend the current thread for ``seconds``.

    Args:
        seconds:
            Either the delay, in seconds, or a tuple of a lower and an upper
            bound within which a random delay will be picked.
    g{Gz?N)
isinstancetuplerandomuniformtimesleep)r@   r   r   r   _delay   s
   

rG   c                
   @   s   e Zd ZU dZG dd dZee ed< ee ed< ee	j
 ed< eed< ded	ed
 dededdf
ddZedee fddZdeddfddZdddZdddZedddZedd ZdS )_PeriodicTimerzRepresent a timer that periodically runs a specified function.

    Args:
        interval:
            The interval, in seconds, between each run.
        function:
            The function to run.
    c                   @   sJ   e Zd ZU eed< ed ed< eedf ed< ee	ef ed< e
ed< dS )	z_PeriodicTimer._Contextinterval.Nfunction.argskwargs
stop_eventN)__name__
__module____qualname__float__annotations__r   rB   r   dictr;   r   r   r   r   r   _Context   s   
 rU   _name_thread
_finalizer_ctxrI   rK   rJ   rL   rM   r   Nc                 O   sV   d | _ |  | _| | j_|| j_|pd| j_|pi | j_t | j_	d | _
d | _d S )Nr   )rV   rU   rY   total_secondsrI   rK   rL   rM   r   rN   rW   rX   )selfrI   rK   rL   rM   r   r   r   __init__   s   


z_PeriodicTimer.__init__c                 C   s   | j S )zGet the name of the timer.)rV   r[   r   r   r   name   s   z_PeriodicTimer.namer^   c                 C   s   | j rtd|| _dS )zSet the name of the timer.

        The specified name will be assigned to the background thread and serves
        for debugging and troubleshooting purposes.
        The timer has already started.N)rW   RuntimeErrorrV   )r[   r^   r   r   r   set_name   s   
z_PeriodicTimer.set_namec                 C   s\   | j rtdt| j| jpd| jfdd| _ t| | j| j | jj	| _
d| j
_| j   dS )zStart the timer.r_   ZPeriodicTimerT)targetr^   rL   daemonFN)rW   r`   r   _runrV   rY   weakreffinalize_stop_threadrN   rX   atexitstartr]   r   r   r   ri      s   z_PeriodicTimer.startc                 C   s   | j r	|    dS dS )z'Stop the timer at the next opportunity.N)rX   r]   r   r   r   cancel  s   z_PeriodicTimer.cancelc                 C   s8   | j | js| j| ji | j | j | jrd S d S N)rN   waitrI   rK   rL   rM   )ctxr   r   r   rd     s   z_PeriodicTimer._runc                 C   s   |   |   d S rk   )setjoin)threadrN   r   r   r   rg     s   z_PeriodicTimer._stop_thread)r   N)rO   rP   rQ   __doc__rU   r   r;   rS   r   re   rf   r   r   r   r\   propertyr^   ra   ri   rj   staticmethodrd   rg   r   r   r   r   rH      s6   
 


rH   )r2   rC   r   r5   rE   re   datetimer   	threadingr   r   typingr   r   r   r   __all__r;   rT   r   r   r   rB   r	   boolr?   rR   rG   rH   r   r   r   r   <module>   s,   &

1"4