o
    HXh."                     @   s   d dl 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	Z	d dl
Z
d dlmZ dZdZdZe Zdd	 ZG d
d dejZG dd deZG dd dZG dd deZG dd dejZG dd dejZedkrte  dS dS )    N)support)threading_helper)
lock_tests
      g{Gz?c                 C   s>   	 t jrt t|  W d    d S 1 sw   Y  d S d S N)r   verbose_print_mutexprint)arg r   :/opt/python-3.10.19/usr/lib/python3.10/test/test_thread.pyverbose_print   s   
"r   c                   @   s   e Zd Zdd ZdS )BasicThreadTestc                 C   sZ   t  | _| j  t  | _t  | _d| _d| _d| _t	
 }| jt	jg|R   d S Nr   )threadallocate_lock
done_mutexacquirerunning_mutexrandom_mutexcreatedrunning
next_identr   Zthreading_setupZ
addCleanupZthreading_cleanup)selfkeyr   r   r   setUp   s   



zBasicThreadTest.setUpN)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                   @   sV   e Zd Zdd Zdd Zdd Zdd Zee	j
d	vd
dd Zdd Zdd ZdS )ThreadRunningTestsc                 C   sv   | j . |  jd7  _td| j  t| j| jf |  jd7  _|  jd7  _W d    d S 1 s4w   Y  d S )N   zcreating task %s)r   r   r   r   start_new_threadtaskr   r   r   r   r   r   newtask*   s   "zThreadRunningTests.newtaskc                 C   s   | j  t d }W d    n1 sw   Y  td|t|d f  t| td|  | j/ |  jd8  _| jt	krR| jdkrZ| j
  W d    d S W d    d S W d    d S 1 sew   Y  d S )N     @task %s will run for %sus    .Aztask %s doner!   r   )r   randomr   roundtimesleepr   r   r   NUMTASKSr   release)r   identdelayr   r   r   r#   2   s   
"zThreadRunningTests.taskc                 C   s^   t  ! ttD ]}|   q	td | j  td W d    d S 1 s(w   Y  d S )Nz waiting for tasks to complete...all tasks done)r   wait_threads_exitranger-   r%   r   r   r   r   ir   r   r   test_starting_threads=   s   



"z(ThreadRunningTests.test_starting_threadsc                 C   s2   |  t dd td |  t dd d S )Nr   zinitial stack size is not 0zstack_size not reset to default)assertEqualr   
stack_sizer$   r   r   r   test_stack_sizeF   s   
z"ThreadRunningTests.test_stack_size)ntposixztest meant for nt and posixc              	   C   s  zt d W n ty   td Y n t jy"   | d Y nw d}dD ]}t | | t  |||  td|  q'dD ]:}td|  d	| _d	| _t	
   ttD ]}|   qYtd
 | j  td W d    n1 sww   Y  qBt d	 d S )Ni   z3caught expected ValueError setting stack_size(4096)z4platform does not support changing thread stack sizez&stack_size(%d) failed - should succeed)      r   zsuccessfully set stack_size(%d))r<   r=   ztrying stack_size = (%d)r   z!waiting for all tasks to completer1   )r   r8   
ValueErrorr   errorZskipTestr7   r   r   r   r2   r3   r-   r%   r   r   )r   Zfail_msgZtssr5   r   r   r   test_nt_and_posix_stack_sizeM   s2   




z/ThreadRunningTests.test_nt_and_posix_stack_sizec                    s   t  }t    g fdd}t H t |d s)tt	 r"| 
t  |d    g  t| fdd}~ sQtt	 t   rF| 
t  | W d    d S 1 sdw   Y  d S )Nc                      s    d        d S r   )appendr   r.   r   )mutstartedr   r   r#   s   s   
z,ThreadRunningTests.test__count.<locals>.taskr   r!   c                    s
     d S r   )rA   )_)doner   r   <lambda>   s   
 z0ThreadRunningTests.test__count.<locals>.<lambda>)r   _countr   r   r   r2   r"   r+   r,   
POLL_SLEEPr7   r.   weakrefrefr   
gc_collect)r   Zorigr#   wrr   )rE   rB   rC   r   test__countl   s*   


"zThreadRunningTests.test__countc              	      s    fdd}t   t L}t     t |d    W d    n1 s,w   Y  | t	|j
jd | |j
j| | |j
jd | |j
j W d    d S 1 s]w   Y  d S )Nc                      s       td)Ntask failed)r.   r>   r   rC   r   r   r#      s   z:ThreadRunningTests.test_unraisable_exception.<locals>.taskr   rN   z&Exception ignored in thread started by)r   r   r   Zcatch_unraisable_exceptionr   r2   r   r"   r7   strZ
unraisable	exc_valueZassertIsobjecterr_msgassertIsNotNoneexc_traceback)r   r#   cmr   rO   r   test_unraisable_exception   s   



"z,ThreadRunningTests.test_unraisable_exceptionN)r   r   r   r%   r#   r6   r9   unittestZskipIfosnamer@   rM   rW   r   r   r   r   r    (   s    	
r    c                   @      e Zd Zdd Zdd ZdS )Barrierc                 C   s.   || _ d| _t | _t | _| j  d S r   )num_threadswaitingr   r   checkin_mutexcheckout_mutexr   )r   r]   r   r   r   __init__   s
   

zBarrier.__init__c                 C   s   | j   | jd | _| j| jkr| jd | _| j  d S | j   | j  | jd | _| jdkr:| j   d S | j  d S )Nr!   r   )r_   r   r^   r]   r`   r.   r$   r   r   r   enter   s   





zBarrier.enterN)r   r   r   ra   rb   r   r   r   r   r\      s    r\   c                   @   r[   )BarrierTestc                 C   sv   t  - tt| _t| _ttD ]
}t| j	|f qt
d | j  t
d W d    d S 1 s4w   Y  d S )Nzwaiting for tasks to endz
tasks done)r   r2   r\   r-   barr   r3   r   r"   task2r   r   r   r4   r   r   r   test_barrier   s   



"zBarrierTest.test_barrierc              	   C   s   t tD ]F}|dkrd}n| j t d }W d    n1 s!w   Y  td|t|d f  t| td||f  | j	  td|  q| j
 |  jd8  _| jdk}W d    n1 sew   Y  |rs| j  d S d S )Nr   r&   r'   r(   ztask %s entering %sztask %s leaving barrierr!   )r3   NUMTRIPSr   r)   r   r*   r+   r,   rd   rb   r   r   r   r.   )r   r/   r5   r0   finishedr   r   r   re      s(   

zBarrierTest.task2N)r   r   r   rf   re   r   r   r   r   rc      s    
rc   c                   @   s   e Zd ZejZdS )	LockTestsN)r   r   r   r   r   Zlocktyper   r   r   r   ri      s    
ri   c                   @   s<   e Zd Zdd Zeeeddej	dd Z
dd Zd	S )
TestForkInThreadc                 C   s   t  \| _| _d S r   )rY   piperead_fdwrite_fdr$   r   r   r   r      s   zTestForkInThread.setUpforkzneed os.forkc                    s   d   fdd}t  # t|| j| jf | t| jdd t	| j W d    n1 s2w   Y  | 
  tj dd d S )Nc              	      sD   t    rd S zt |  t |d W t d d S t d w )N   OKr   )rY   rn   closewrite_exit)rl   rm   pidr   r   fork_thread   s   
z7TestForkInThread.test_forkinthread.<locals>.fork_thread   ro   r   )exitcode)r   r2   r   r"   rl   rm   r7   rY   readrp   rT   r   Zwait_process)r   ru   r   rs   r   test_forkinthread   s   

z"TestForkInThread.test_forkinthreadc                 C   sL   zt | j W n	 ty   Y nw z	t | j W d S  ty%   Y d S w r   )rY   rp   rl   OSErrorrm   r$   r   r   r   tearDown   s   zTestForkInThread.tearDownN)r   r   r   r   rX   Z
skipUnlesshasattrrY   r   Zreap_threadsry   r{   r   r   r   r   rj      s    rj   __main__)rY   rX   r)   testr   Ztest.supportr   _threadr   r+   rI   r   r-   rg   rH   r   r	   r   ZTestCaser   r    r\   rc   ri   rj   r   mainr   r   r   r   <module>   s.    u%-