o
    Zh                     @   sT   d Z ddlZddlZddlmZ ddlmZ ddlZddlm	Z	 G dd deZ
dS )z=The client and server for a basic ping-pong style heartbeat.
    N)Path)Thread)	localhostc                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )	Heartbeatz9A simple ping-pong style heartbeat that runs in a thread.Nc                 C   s|   |du r
dt  df}tj| dd || _|\| _| _| _| j| _| jdkr)|   | j| jf| _	d| _
d| _d| _d| _dS )z Initialize the heartbeat thread.Ntcpr   r   )nameT)r   r   __init__context	transportipportoriginal_port	pick_portaddrdaemonZpydev_do_not_traceZis_pydev_daemon_threadr   )selfr	   r    r   J/var/www/html/lang_env/lib/python3.10/site-packages/ipykernel/heartbeat.pyr      s   

zHeartbeat.__init__c                 C   s   | j dkr&t }|| jdkrdn| jdf | d | _|  | jS | j dkrQd| _t| j d| j  rN| jd | _t| j d| j  s;| jS t	d| j  )	zPick a port for the heartbeat.r   * r      Zipc-zUnrecognized zmq transport: %s)
r
   socketbindr   getsocknamer   closer   exists
ValueError)r   sr   r   r   r   /   s   

zHeartbeat.pick_portc                 C   s:   | j dkrdnd}| j| j  d| j | t| j S )Nr   :r   z://)r
   r   r   r   strr   )r   cr   r   r   _try_bind_socket?   s   (zHeartbeat._try_bind_socketc                 C   s   zt j}W n ty   d }Y nw | jrdnd}t|D ];}z|   W  d S  tjyW } z$||d kr6 |j t jkrB|j |krB | jdkrL| 	  n W Y d }~qd }~ww d S )Nr   d   r   )
errnoZWSAEADDRINUSEAttributeErrorr   ranger"   zmqZMQError
EADDRINUSEr   )r   Z
win_in_useZmax_attemptsattemptZzer   r   r   _bind_socketC   s,   



zHeartbeat._bind_socketc                 C   s   d| _ | jtj| _d| j_z|   W n ty"   | j   w 	 zt	tj
| j| j W dS  tjyw } z9|jtjkrFW Y d}~q#|jtjkrez| j  W n
 tjy]   Y nw W Y d}~dS |jtjkrrW Y d}~dS  d}~ww )zRun the heartbeat thread.r   i  TN)r   r	   r   r'   ZROUTERZlingerr+   	Exceptionr   ZdeviceZQUEUEr(   r$   ZEINTRZETERMENOTSOCK)r   er   r   r   run]   s8   
zHeartbeat.run)N)	__name__
__module____qualname____doc__r   r   r"   r+   r/   r   r   r   r   r      s    
r   )r3   r$   r   pathlibr   	threadingr   r'   Zjupyter_client.localinterfacesr   r   r   r   r   r   <module>   s    