
    0hhc9                        S SK r S SKrS SKrS SKJr  S SKJr  S SKrS SK	r	S SK
r
S SKrS SKJr  \R                  " SS9  SrSr\R                   " 5       rS	 r " S
 S\R&                  5      r " S S\5      r " S S5      r " S S\5      r " S S\R0                  5      r " S S\R&                  5      r\S:X  a  \R6                  " 5         gg)    N)support)threading_helper)
lock_testsT)module
      c                     [         R                  (       a  [           [        U 5        SSS5        gg! , (       d  f       g= f)z2Helper function for printing out debugging output.N)r   verbose_print_mutexprint)args    9/opt/python-3.13.8/usr/lib/python3.13/test/test_thread.pyverbose_printr      s%    #J \ \s	   2
A c                       \ rS rSrS rSrg)BasicThreadTest   c                 j   [         R                  " 5       U l        U R                  R                  5         [         R                  " 5       U l        [         R                  " 5       U l        SU l        SU l        SU l        [        R                  " 5       nU R                  " [        R                  /UQ76   g Nr   )threadallocate_lock
done_mutexacquirerunning_mutexrandom_mutexcreatedrunning
next_identr   threading_setup
addCleanupthreading_cleanup)selfkeys     r   setUpBasicThreadTest.setUp   s     ..0!#113"002..0(::ASA    )r   r   r   r   r   r   N)__name__
__module____qualname____firstlineno__r#   __static_attributes__ r%   r   r   r      s    
Br%   r   c                       \ rS rSrS rS rS rS r\R                  " \
R                  S;  S5      S 5       rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rSrg)ThreadRunningTests*   c                 V   U R                      U =R                  S-  sl        [        SU R                  -  5        [        R                  " U R
                  U R                  45        U =R                  S-  sl        U =R                  S-  sl        S S S 5        g ! , (       d  f       g = f)N   zcreating task %s)r   r   r   r   start_new_threadtaskr   r   r!   s    r   newtaskThreadRunningTests.newtask,   sn    OOq O,t>?##DII/ABLLALLLAL  s   BB
B(c           	         U R                      [        R                  " 5       S-  nS S S 5        [        SU< S[        WS-  5      < S35        [        R
                  " U5        [        SU-  5        U R                     U =R                  S-  sl        U R                  [        :X  a*  U R                  S:X  a  U R                  R                  5         S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	N     @task  will run for     .Ausztask %s doner0   r   )r   randomr   roundtimesleepr   r   r   NUMTASKSr   release)r!   identdelays      r   r2   ThreadRunningTests.task4   s    MMOg-E UE%)<LMN

5nu,-LLAL||x'DLLA,='')   
  s   C>AC,
C),
C:c                    [         R                  " 5          [        [        5       H  nU R	                  5         M     [        S5        U R                  R                  5         [        S5        S S S 5        g ! , (       d  f       g = f)Nz waiting for tasks to complete...all tasks done)r   wait_threads_exitranger@   r4   r   r   r   r!   is     r   test_starting_threads(ThreadRunningTests.test_starting_threads?   sS    //18_ %<=OO##%*+ 211s   AA66
Bc                     U R                  [        R                  " 5       SS5        [        R                  " S5        U R                  [        R                  " 5       SS5        g )Nr   zinitial stack size is not 0zstack_size not reset to default)assertEqualr   
stack_sizer3   s    r   test_stack_size"ThreadRunningTests.test_stack_sizeH   sH    **,a1NO!**,a1RSr%   )ntposixztest meant for nt and posixc                     [         R                  " S5        SnS HO  n[         R                  " U5        U R                  [         R                  " 5       X!U-  5        [        SU-  5        MQ     S H  n[        SU-  5        S	U l        S	U l        [        R                  " 5          [        [        5       H  nU R                  5         M     [        S
5        U R                  R                  5         [        S5        S S S 5        M     [         R                  " S	5        g ! [         a    [        S5         GN[         R                   a    U R                  S5         GNFf = f! , (       d  f       GM  = f)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))rU   rV   ztrying stack_size = (%d)r   z!waiting for all tasks to completerF   )r   rO   
ValueErrorr   errorskipTestrN   r   r   r   rG   rH   r@   r4   r   r   )r!   fail_msgtssrJ   s       r   test_nt_and_posix_stack_size/ThreadRunningTests.test_nt_and_posix_stack_sizeO   s*   	"d# <(Cc"V..0##~F;cAB )
 &C4s:;DODL!335xALLN ) AB'')./ 65	 & 	!3  	0 / 0|| 	"MM ! "	" 65s$   D %AE"E7$EE"
E2	c                   ^^^ [         R                  " 5       n[         R                  " 5       mTR                  5         / mUU4S jn[        R
                  " 5          [         R                  " US5        [        R                  " [        R                  5       H  nT(       d  M    O   U R                  [         R                  " 5       US-   5        TR                  5         / m[        R                  " UU4S j5      nA[        R                  " [        R                  5       H!  nT(       a    O[        R                  " 5         M#     U R                  [         R                  " 5       U5        S S S 5        g ! , (       d  f       g = f)Nc                  h   > TR                  S 5        T R                  5         T R                  5         g N)appendr   rA   )mutstarteds   r   r2   ,ThreadRunningTests.test__count.<locals>.tasku   s!    NN4 KKMKKMr%   r+   r0   c                 &   > TR                  S 5      $ r`   )ra   )_dones    r   <lambda>0ThreadRunningTests.test__count.<locals>.<lambda>   s    T[[->r%   )r   _countr   r   r   rG   r1   r   sleeping_retryLONG_TIMEOUTrN   rA   weakrefref
gc_collect)r!   origr2   rf   wrrg   rb   rc   s        @@@r   test__countThreadRunningTests.test__countn   s   }}""$	
 //1##D"-++G,@,@A7 B V]]_dQh7 KKM
 DT#>?B++G,@,@A""$ B V]]_d3+ 211s   AE5$CE55
Fc                   ^ U4S jn[         R                  " 5       m[        R                  " 5        n[        R
                  " 5          TR                  5         [         R                  " US5        TR                  5         S S S 5        U R                  [        UR                  R                  5      S5        U R                  UR                  R                  5        U R                  UR                  R                  SU< 35        U R                  UR                  R                   5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nc                  :   > T R                  5         [        S5      e)Ntask failed)rA   rW   )rc   s   r   r2   :ThreadRunningTests.test_unraisable_exception.<locals>.task   s    OO]++r%   r+   rv   z'Exception ignored in thread started by )r   r   r   catch_unraisable_exceptionr   rG   r   r1   rN   str
unraisable	exc_valueassertIsNoneobjecterr_msgassertIsNotNoneexc_traceback)r!   r2   cmrc   s      @r   test_unraisable_exception,ThreadRunningTests.test_unraisable_exception   s    	, &&(//1R!335!''b1! 6
 S!8!89=Ibmm223R]]22FthOQ  !<!<= 2155 21s$   E8D4 B+E4
E	>E
Ec                 4  ^ / mU4S jn[         R                  " 5          [        R                  " U5      nUR	                  5         U R                  [        T5      S5        U R                  UR                  TS   5        S S S 5        g ! , (       d  f       g = f)Nc                  z   > [         R                  " S5        T R                  [        R                  " 5       5        g )N皙?)r>   r?   ra   r   	get_ident)finisheds   r   r2   1ThreadRunningTests.test_join_thread.<locals>.task   s$    JJtOOF,,./r%   r0   r   )r   rG   r   start_joinable_threadjoinrN   lenrB   )r!   r2   handler   s      @r   test_join_thread#ThreadRunningTests.test_join_thread   sl    	0 //111$7FKKMS]A.V\\8A;7	 211s   A!B		
Bc                     S n[         R                  " 5          [        R                  " U5      n[        R
                  " S5        UR                  5         S S S 5        g ! , (       d  f       g = f)Nc                      g r`   r+   r+   r%   r   r2   @ThreadRunningTests.test_join_thread_already_exited.<locals>.task       r%   r   )r   rG   r   r   r>   r?   r   r!   r2   r   s      r   test_join_thread_already_exited2ThreadRunningTests.test_join_thread_already_exited   sF    	 //111$7FJJtKKM 211s   =A
A-c                     S n[         R                  " 5          [        R                  " U5      nUR	                  5         UR	                  5         S S S 5        g ! , (       d  f       g = f)Nc                      g r`   r+   r+   r%   r   r2   8ThreadRunningTests.test_join_several_times.<locals>.task   r   r%   r   rG   r   r   r   r   s      r   test_join_several_times*ThreadRunningTests.test_join_several_times   sC    	 //111$7FKKMKKM	 211s   7A
A'c                   ^ [         R                  " 5       mTR                  5         U4S jn[        R                  " 5          [         R
                  " U5      nATR                  5         S S S 5        g ! , (       d  f       g = f)Nc                  &   > T R                  5         g r`   r   )handle_destroyeds   r   r2   9ThreadRunningTests.test_joinable_not_joined.<locals>.task   s    $$&r%   )r   r   r   r   rG   r   rA   )r!   r2   r   r   s      @r   test_joinable_not_joined+ThreadRunningTests.test_joinable_not_joined   s\    !//1  "	' //111$7F$$& 211s   (A33
Bc                   ^^^^ / m/ m[         R                  " 5       mTR                  5         [         R                  " 5       mTR                  5         UUUU4S jn[        R                  " 5          [         R
                  " U5      nTR                  U5        TR                  5         TR                  5         UR                  5         S S S 5        U R                  [        S5         TS   e! , (       d  f       N*= f! , (       d  f       g = f)Nc                     > TR                  5          TS   R                  5         TR	                  5         g ! [         a  n TR                  U 5         S n A N1S n A ff = f! TR	                  5         f = fr   )r   r   	Exceptionra   rA   )eerrorshandlesstart_joinable_thread_returnedtask_tried_to_joins    r   r2   4ThreadRunningTests.test_join_from_self.<locals>.task   s`    *224-
! #**,  !a  ! #**,s'   7 
AAA AA A1Cannot join current threadr   )r   r   r   r   rG   r   ra   rA   r   assertRaisesRegexRuntimeError)r!   r2   r   r   r   r   r   s      @@@@r   test_join_from_self&ThreadRunningTests.test_join_from_self   s    )/)=)=)?&&..0#113""$	- 	- //111$7FNN6"*224&&(KKM 2 ##L2NO)O 21 POs   1AC-'C>-
C;>
Dc                 >  ^^^^^	 S nS mS mU" 5       m	U" 5       mUUUU	4S jnU" 5       mUU4S jn[         R                  " 5          [        R                  " U5      mT	R	                  5         [        R                  " U5      nTR	                  5         [
        R                  " S5        TR                  5         TR                  5         UR                  5         U R                  [        S5         Te! , (       d  f       O= f S S S 5        g ! , (       d  f       g = f)Nc                  P    [         R                  " 5       n U R                  5         U $ r`   )r   r   r   locks    r   	make_lock>ThreadRunningTests.test_join_then_self_join.<locals>.make_lock   s    '')DLLNKr%   c                     > TR                  5         TR                  5          TR                  5         g ! [         a  n U m S n A g S n A ff = fr`   )rA   r   r   r   )r   rX   self_joiner_barrierself_joiner_handleself_joiner_starteds    r   self_joiner@ThreadRunningTests.test_join_then_self_join.<locals>.self_joiner   sC      '')'')"'') s   4 
A
AA
c                  F   > T R                  5         TR                  5         g r`   )rA   r   )joiner_startedr   s   r   joiner;ThreadRunningTests.test_join_then_self_join.<locals>.joiner  s    ""$##%r%   皙?r   )r   rG   r   r   r   r>   r?   rA   r   r   r   )
r!   r   r   r   joiner_handlerX   r   r   r   r   s
        @@@@@r   test_join_then_self_join+ThreadRunningTests.test_join_then_self_join   s    	
 !'k'k		 		 #	& //1!'!=!=k!J'') #88@M ""$ JJsO  '')##% ''6RS TSS+ 211s   B)D0C33
D	=D
Dc                   ^ [         R                  " 5       mTR                  5         U4S jn[        R                  " 5          [         R
                  " U5      nUR                  S5        U R                  UR                  5       5        TR                  5         UR                  5         U R                  UR                  5       5        S S S 5        g ! , (       d  f       g = f)Nc                  &   > T R                  5         g r`   r   r   s   r   thr6ThreadRunningTests.test_join_with_timeout.<locals>.thr(      LLNr%   r   )r   r   r   r   rG   r   r   assertFalseis_donerA   
assertTrue)r!   r   r   r   s      @r   test_join_with_timeout)ThreadRunningTests.test_join_with_timeout$  s    ##%	 //111#6FKKV^^-.LLNKKMOOFNN,- 211s   BC
Cc                     [         R                  " 5       nU R                  [        S5         UR	                  5         S S S 5        g ! , (       d  f       g = fNzthread not started)r   _ThreadHandler   r   r   r!   r   s     r   test_join_unstarted&ThreadRunningTests.test_join_unstarted3  s7    %%'##L2FGKKM HGG   A
Ac                     [         R                  " 5       nU R                  [        S5         UR	                  5         S S S 5        g ! , (       d  f       g = fr   )r   r   r   r   	_set_doner   s     r   test_set_done_unstarted*ThreadRunningTests.test_set_done_unstarted8  s:    %%'##L2FG HGGr   c                   ^ [         R                  " 5       mTR                  5         U4S jn[         R                  " 5       n[        R
                  " 5          [         R                  " XS9  U R                  [        S5         [         R                  " XS9  S S S 5        TR                  5         UR                  5         S S S 5        g ! , (       d  f       N7= f! , (       d  f       g = f)Nc                  &   > T R                  5         g r`   r   r   s   r   func<ThreadRunningTests.test_start_duplicate_handle.<locals>.funcA  r   r%   r   zthread already started)r   r   r   r   r   rG   r   r   r   rA   r   )r!   r   r   r   s      @r   test_start_duplicate_handle.ThreadRunningTests.test_start_duplicate_handle=  s    ##%	 %%'//1((=''6NO,,TA PLLNKKM 21OO 21s$   +CC(C
C	C
C'c                     S n[         R                  " 5          [        R                  " US S9nUR	                  5         S S S 5        g ! , (       d  f       g = f)Nc                      g r`   r+   r+   r%   r   r   <ThreadRunningTests.test_start_with_none_handle.<locals>.funcM  r   r%   r   r   )r!   r   r   s      r   test_start_with_none_handle.ThreadRunningTests.test_start_with_none_handleL  s<    	 //111$tDFKKM 211s   &A
A)r   r   N)r&   r'   r(   r)   r4   r2   rK   rP   unittestskipIfosnamer\   rr   r   r   r   r   r   r   r   r   r   r   r   r   r*   r+   r%   r   r-   r-   *   s    	*,T __RWWO35RS T<!4F>$8
':6p.

r%   r-   c                        \ rS rSrS rS rSrg)BarrieriU  c                     Xl         SU l        [        R                  " 5       U l        [        R                  " 5       U l        U R
                  R                  5         g r   )num_threadswaitingr   r   checkin_mutexcheckout_mutexr   )r!   r   s     r   __init__Barrier.__init__V  sC    &$224$224##%r%   c                    U R                   R                  5         U R                  S-   U l        U R                  U R                  :X  a/  U R                  S-
  U l        U R                  R                  5         g U R                   R                  5         U R                  R                  5         U R                  S-
  U l        U R                  S:X  a  U R                   R                  5         g U R                  R                  5         g )Nr0   r   )r   r   r   r   r   rA   r3   s    r   enterBarrier.enter]  s    ""$||a'<<4+++++a/DL'')""$##%||a'<<1&&(##%r%   )r   r   r   r   N)r&   r'   r(   r)   r   r   r*   r+   r%   r   r   r   U  s    &&r%   r   c                        \ rS rSrS rS rSrg)BarrierTestin  c                 p   [         R                  " 5          [        [        5      U l        [        U l        [        [        5       H%  n[        R                  " U R                  U45        M'     [        S5        U R                  R                  5         [        S5        S S S 5        g ! , (       d  f       g = f)Nzwaiting for tasks to endz
tasks done)r   rG   r   r@   barr   rH   r   r1   task2r   r   r   rI   s     r   test_barrierBarrierTest.test_barrierp  sr    //1x(DH#DL8_''

QD9 %45OO##%,' 211s   BB''
B5c           
      x   [        [        5       H  nUS:X  a  SnO-U R                     [        R                  " 5       S-  nS S S 5        [	        SU< S[        WS-  5      < S35        [        R                  " U5        [	        SU< SU< 35        U R                  R                  5         [	        SU-  5        M     U R                     U =R                  S	-  sl        U R                  S:H  nS S S 5        W(       a  U R                  R                  5         g g ! , (       d  f       N= f! , (       d  f       NB= f)
Nr   r7   r8   r9   r:   r;   z
 entering ztask %s leaving barrierr0   )rH   NUMTRIPSr   r<   r   r=   r>   r?   r   r   r   r   r   rA   )r!   rB   rJ   rC   r   s        r   r   BarrierTest.task2z  s    xAz &&"MMOg5E ' %"46 7JJu5!<=HHNN3e;< ! LLAL ||q(H   OO##%  '&  s   D
%D+
D(	+
D9)r   r   N)r&   r'   r(   r)   r   r   r*   r+   r%   r   r   r   n  s    (&r%   r   c                   ,    \ rS rSr\R
                  rSrg)	LockTestsi  r+   N)r&   r'   r(   r)   r   r   locktyper*   r+   r%   r   r  r    s    ##Hr%   r  c                   l    \ rS rSrS r\R                  " 5       \R                  S 5       5       r	S r
Srg)TestForkInThreadi  c                 H    [         R                  " 5       u  U l        U l        g r`   )r   piperead_fdwrite_fdr3   s    r   r#   TestForkInThread.setUp  s    &(ggi#dmr%   c                   ^ S mU4S jn[         R                  " 5          [        R                  " XR                  U R
                  45        U R                  [        R                  " U R                  S5      S5        [        R                  " U R
                  5        S S S 5        U R                  T5        [        R                  " TSS9  g ! , (       d  f       N5= f)Nc                 x  > [         R                  " [        SS9   [        R                  " 5       =m(       a
   S S S 5        g  S S S 5         [        R
                  " U 5        [        R                  " US5        [        R                  " S5        g ! , (       d  f       NS= f! [        R                  " S5        f = f)Nignore)categoryaction   OKr   )warningscatch_warningsDeprecationWarningr   forkclosewrite_exit)r  r	  pids     r   fork_thread7TestForkInThread.test_forkinthread.<locals>.fork_thread  s     ((2D08: 779$C$: : %:!5): : s   B-B! 
B!B9   r  r   )exitcode)r   rG   r   r1   r  r	  rN   r   readr  r   r   wait_process)r!   r  r  s     @r   test_forkinthread"TestForkInThread.test_forkinthread  s     	$ //1##K,,1NORWWT\\15u=HHT]]# 2
 	S!S1- 21s   A>C
Cc                      [         R                  " U R                  5         [         R                  " U R                  5        g ! [         a     N.f = f! [         a     g f = fr`   )r   r  r  OSErrorr	  r3   s    r   tearDownTestForkInThread.tearDown  sS    	HHT\\"	HHT]]#	  		
  		s"    A  A 
AA
A! A!)r  r	  N)r&   r'   r(   r)   r#   r   requires_forkr   reap_threadsr  r#  r*   r+   r%   r   r  r    s7    0 "". # .:	r%   r  __main__)r   r   r<   testr   test.supportr   _threadr   r>   r  rm   r   requires_working_threadingr@   r   r   r   r   TestCaser   r-   r   r   r  r  r&   mainr+   r%   r   <module>r.     s    	    )       + +4 8##%Bh'' Bh hV	& &2#&/ #&J$
$$ $,x(( ,^ zMMO r%   