a
    h                      @   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eeeef dddZeee d	d
dZee eeeef dddZeedddZeeeeef f dd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 ]Z}|dd^}}|  }|sJtd|r\|d   }nd}|stt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   X/var/www/auris/lib/python3.9/site-packages/torch/distributed/elastic/rendezvous/utils.py_parse_rendezvous_config   s*    


r   )port_strr   c                 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_portr   c                 C   s   | dur|   } | sd|fS | d dkrF| d dkrF| gg R ^}}n| dd^}}t|dkr|d dkr|d dkr|dd }t|dkrt|d }|du s|d	krtd
|  dn|}td|st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)   r   c              
   C   s"  | dkrdS zt | }W n ty0   d}Y n0 |r@|jr@dS ztj| dtjtjd}W n. ttjfy } zg }W Y d}~n
d}~0 0 dd |D }t	 }| |krdS tj|dtjtjd}|D ]V}|d r|d | kr dS |r|d d	 t
|kr dS |d d	 |v r dS qd
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>       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_listZ	addr_infor   r   r   _matches_machine_hostnamet   s:    


r?   )secondsr   c                 C   s*   t | trtj|  } | dkr&t|  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< eed eed	d
ddZeee dddZed	dddZd	dddZd	dddZed	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_ctxrJ   N)rI   rK   rL   rM   r   c                 O   sV   d | _ |  | _| | j_|| j_|p*d| j_|p6i | 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__)r   c                 C   s   | j S )zGet the name of the timer.)rV   r[   r   r   r   name   s    z_PeriodicTimer.name)r^   r   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 )z'Stop the timer at the next opportunity.N)rX   r]   r   r   r   cancel  s    z_PeriodicTimer.cancelc                 C   s(   | j | js$| j| ji | j q 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)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      s*   
rH   )r3   rC   r   r6   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 