o
    JXh                     @   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 Zdd Z	dd Z
ejdd	d
ZdddZejdddZG dd dZdS )    N)supportc                   C   s   t  tj fS N)_thread_count	threading	_danglingcopy r	   r	   G/opt/python-3.10.19/usr/lib/python3.10/test/support/threading_helper.pythreading_setup   s   r   c               
   G   s   d}t |D ]L}t tjf}|| kr d S |sGdt_|d }td|d | d   d|d  dt| d |D ]
}td	| q:d }d }t	
d
 t  qd S )Nd   T   z&threading_cleanup() failed to cleanup r   z threads (count: z, dangling: )zDangling thread: {Gz?)ranger   r   r   r   r   Zenvironment_alteredZprint_warninglentimesleep
gc_collect)Zoriginal_valuesZ
_MAX_COUNTcountvaluesZdangling_threadsthreadr	   r	   r
   threading_cleanup   s,   


r   c                    s   	 t   fdd}|S )Nc                     s$   t  }z	 |  W t|  S t|  w r   )r   r   )argskeyfuncr	   r
   	decorator:   s   zreap_threads.<locals>.decorator)	functoolswraps)r   r   r	   r   r
   reap_threads6   s   r    c                 c   s    	 | d u r	t j} t }zCd V  W t }||  }	 t }||kr%d S t |krGt | }d||  d|dd| d| d	}t|td t   qt }||  }	 t }||krd	 w t |krt | }d||  d|dd| d| d	}t|td t   qZ)	NTz!wait_threads() failed to cleanup z threads after .1fz seconds (count: z, old count: r   r   )	r   SHORT_TIMEOUTr   r   r   	monotonicAssertionErrorr   r   )timeoutZ	old_countZ
start_timedeadliner   Zdtmsgr	   r	   r
   wait_threads_exitD   s\   

r(   c                 C   s<   	 |d u rt j}| | |  rd|dd}t|d S )Nzfailed to join the thread in r!   z seconds)r   r"   joinis_aliver$   )r   r%   r'   r	   r	   r
   join_threadi   s   
r+   c                 c   s,   dd l }t| } g }zz| D ]}|  || qW n   tjr/tdt| t|f   d V  W zX|r:|  t	 }t
ddD ]/}|d7 }|D ]}|t|t	  d qKdd |D }|se ntjrrtd	t||f  qCW d
d |D }|r|tj tdt| d S d
d |D }|r|tj tdt| w zW|r|  t	 }t
ddD ]/}|d7 }|D ]}|t|t	  d qdd |D }|s ntjrtd	t||f  qW d
d |D }|r|tj tdt| w d
d |D }|r|tj tdt| w )Nr   z/Can't start %d threads, only %d threads startedr      <   r   c                 S      g | ]}|  r|qS r	   r*   .0tr	   r	   r
   
<listcomp>       z!start_threads.<locals>.<listcomp>z7Unable to join %d threads during a period of %d minutesc                 S   r.   r	   r/   r0   r	   r	   r
   r3      r4   zUnable to join %d threads)faulthandlerliststartappendr   verboseprintr   r   r#   r   r)   maxZdump_tracebacksysstdoutr$   )threadsZunlockr5   startedr2   endtimer%   r	   r	   r
   start_threadsu   s   

rA   c                   @   s.   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
catch_threading_exceptionc                 C   s"   d | _ d | _d | _d | _d | _d S r   )exc_type	exc_valueexc_tracebackr   	_old_hookselfr	   r	   r
   __init__   s
   
z"catch_threading_exception.__init__c                 C   s$   |j | _ |j| _|j| _|j| _d S r   )rC   rD   rE   r   )rH   r   r	   r	   r
   _hook   s   zcatch_threading_exception._hookc                 C   s   t j| _| jt _| S r   )r   
excepthookrF   rJ   rG   r	   r	   r
   	__enter__   s   z#catch_threading_exception.__enter__c                 G   s   | j t_| `| `| `| `d S r   )rF   r   rK   rC   rD   rE   r   )rH   exc_infor	   r	   r
   __exit__   s
   z"catch_threading_exception.__exit__N)__name__
__module____qualname__rI   rJ   rL   rN   r	   r	   r	   r
   rB      s    rB   r   )r   
contextlibr   r<   r   r   testr   r   r   r    contextmanagerr(   r+   rA   rB   r	   r	   r	   r
   <module>   s     
$%