a
    äze³!  ã                   @   sÜ   d dl Z d dlZd dl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rØe ¡  dS )é    N)Úsupport)Ú
lock_testsé
   é   g{®Gáz„?c                 C   s6   t jr2t t| ƒ W d  ƒ n1 s(0    Y  dS )z2Helper function for printing out debugging output.N)r   ÚverboseÚ_print_mutexÚprint)Úarg© r
   ú&/usr/lib/python3.9/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   st   | j Z |  jd7  _td| j ƒ t | j| jf¡ |  jd7  _|  jd7  _W d   ƒ n1 sf0    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(0    Y  td|t|d ƒf ƒ t |¡ td| ƒ | j< |  jd8  _| jt	kr”| jdkr”| j
 ¡  W d   ƒ n1 s¨0    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!   1   s    *
zThreadRunningTests.taskc                 C   s\   t  ¡ @ ttƒD ]}|  ¡  qtdƒ | j ¡  tdƒ W d   ƒ n1 sN0    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_sizeE   s    
z"ThreadRunningTests.test_stack_size)ÚntÚposixztest meant for nt and posixc              	   C   s  zt  d¡ W n6 ty(   tdƒ Y n t jyD   |  d¡ Y n0 d}dD ]0}t  |¡ |  t  ¡ ||| ¡ td| ƒ qNdD ]t}td| ƒ d	| _d	| _t	 
¡ @ ttƒD ]}|  ¡  q²td
ƒ | j ¡  tdƒ W d   ƒ q„1 sî0    Y  q„t  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 completer/   )r   r6   Ú
ValueErrorr   ÚerrorZskipTestr5   r   r   r   r0   r1   r+   r#   r   r   )r   Zfail_msgZtssr3   r
   r
   r   Útest_nt_and_posix_stack_sizeL   s,    



(z/ThreadRunningTests.test_nt_and_posix_stack_sizec                    sÐ   t  ¡ }t  ¡ ‰ˆ ¡  g ‰‡‡fdd„}t ¡ Š t  |d¡ ˆsPt t	¡ q@|  
t  ¡ |d ¡ ˆ ¡  g ‰ t |‡ fdd„¡}~ˆ sžt t	¡ t ¡  q†|  
t  ¡ |¡ W d   ƒ n1 sÂ0    Y  d S )Nc                      s   ˆ  d ¡ ˆ  ¡  ˆ  ¡  d S ©N)Úappendr   r,   r
   )ÚmutÚstartedr
   r   r!   r   s    
z,ThreadRunningTests.test__count.<locals>.taskr
   r   c                    s
   ˆ   d ¡S r?   )r@   )Ú_)Údoner
   r   Ú<lambda>‚   ó    z0ThreadRunningTests.test__count.<locals>.<lambda>)r   Ú_countr   r   r   r0   r    r)   r*   Ú
POLL_SLEEPr5   r,   ÚweakrefÚrefÚ
gc_collect)r   Zorigr!   Úwrr
   )rD   rA   rB   r   Útest__countk   s$    


zThreadRunningTests.test__countc              	      sÆ   ‡ fdd„}t  ¡ ‰ t ¡ –}t ¡ , ˆ  ¡  t  |d¡ ˆ  ¡  W d   ƒ n1 sX0    Y  |  t|j	j
ƒd¡ |  |j	j|¡ |  |j	jd¡ |  |j	j¡ W d   ƒ n1 s¸0    Y  d S )Nc                      s   ˆ   ¡  tdƒ‚d S )Nútask failed)r,   r<   r
   ©rB   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_exceptionr0   r   r    r5   Ú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!   r4   r7   ÚunittestZskipIfÚosÚnamer>   rM   rW   r
   r
   r
   r   r   '   s   	
r   c                   @   s   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rt| 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   r`   ra   r
   r
   r
   r   r[   œ   s   r[   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚBarrierTestc                 C   st   t  ¡ X ttƒ| _t| _ttƒD ]}t | j	|f¡ q"t
dƒ | j ¡  t
dƒ W d   ƒ n1 sf0    Y  d S )Nzwaiting for tasks to endz
tasks done)r   r0   r[   r+   Úbarr   r1   r   r    Útask2r   r   r   r2   r
   r
   r   Útest_barrier·   s    


zBarrierTest.test_barrierc              	   C   sæ   t tƒD ]Œ}|dkrd}n2| j t ¡ d }W d   ƒ n1 sB0    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 sÊ0    Y  |râ| j ¡  d S )Nr   r$   r%   r&   ztask %s entering %sztask %s leaving barrierr   )r1   ÚNUMTRIPSr   r'   r   r(   r)   r*   rc   ra   r   r   r   r,   )r   r-   r3   r.   Úfinishedr
   r
   r   rd   Á   s"    *ÿ

(zBarrierTest.task2N)r   r   r   re   rd   r
   r
   r
   r   rb   µ   s   
rb   c                   @   s   e Zd ZejZdS )Ú	LockTestsN)r   r   r   r   r   Zlocktyper
   r
   r
   r   rh   Ú   s   rh   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  ¡ F t || j| jf¡ |  t | jd¡d¡ t 	| j¡ W d   ƒ n1 sd0    Y  |  
ˆ ¡ t jˆ dd d S )Nc              	      sF   t  ¡ ‰ ˆ rd S z$t  | ¡ t  |d¡ W t  d¡ nt  d¡ 0 d S )Nó   OKr   )rY   rm   ÚcloseÚwriteÚ_exit)rk   rl   ©Úpidr
   r   Úfork_threadç   s    
z7TestForkInThread.test_forkinthread.<locals>.fork_threadé   rn   r   )Úexitcode)r   r0   r   r    rk   rl   r5   rY   Úreadro   rT   Zwait_process)r   rt   r
   rr   r   Útest_forkinthreadâ   s    
*
z"TestForkInThread.test_forkinthreadc                 C   sL   zt  | j¡ W n ty"   Y n0 zt  | j¡ W n tyF   Y n0 d S r?   )rY   ro   rk   ÚOSErrorrl   r"   r
   r
   r   ÚtearDownÿ   s    zTestForkInThread.tearDownN)r   r   r   r   rX   Z
skipUnlessÚhasattrrY   r   Zreap_threadsrx   rz   r
   r
   r
   r   ri   Þ   s
   ri   Ú__main__)rY   rX   r'   Útestr   Ú_threadr   r)   rI   r   r+   rf   rH   r   r   r   ZTestCaser   r   r[   rb   rh   ri   r   Úmainr
   r
   r
   r   Ú<module>   s(   u%-