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 ©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 completer0   )r   r7   Ú
ValueErrorr   ÚerrorZskipTestr6   r   r   r   r1   r2   r,   r$   r   r   )r   Zfail_msgZtssr4   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 r   )Ú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   r1   r!   r*   r+   Ú
POLL_SLEEPr6   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_exceptionr1   r   r!   r6   Ú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"   r5   r8   Ú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   r1   r[   r,   Úbarr   r2   r   r!   Útask2r   r   r   r3   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    )r2   ÚNUMTRIPSr   r(   r   r)   r*   r+   rc   ra   r   r   r   r-   )r   r.   r4   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   r1   r   r!   rk   rl   r6   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%-