
    hcF                     Z   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Zd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZm Z  d dl!m"Z" d d	l#m$Z$m%Z% ej&        d
k    rd dl'Z'dZ(e(e k    sJ dZ)e)e(k    sJ dZ* e+ed          o e+ed          Z,dedede-fdZ.de/ee0f         fdZ1de0dededej2        fdZ3dede0defdZ4 G d d          Z5 G d de          Z6e0Z7e/ed         e6f         e/ed         e7f         z  Z8 G d d e9          Z: G d! d"ej;                  Z<d#e=e<         de=e<         fd$Z> G d% d&          Z?d'eddfd(Z@ G d) d*ejA                  ZBd+eCe0ef         deeCe0ef         z  fd,ZDdeEeFe                  fd-ZGdS ).    N)
NamedTupleNoReturnLiteralAnyTextIO)support)	os_helper)	Namespace)Regrtest)runtest	is_failed
TestResultInterruptedTimeout
ChildErrorPROGRESS_MIN_TIME)setup_tests)format_durationprint_warningwin32g      >@g     r@setsidkillpgresultnsreturnc                 f    t          | t                    rdS |j        rt          | |          rdS dS )NTF)
isinstancer   failfastr   )r   r   s     2/usr/lib/python3.11/test/libregrtest/runtest_mp.py	must_stopr    ,   s>    &+&& t	{ y,, t5    c                 P    t          j        |           \  }}t          di |}||fS )N )jsonloadsr
   )worker_argsns_dict	test_namer   s       r   parse_worker_argsr)   4   s3    K00GY			W		B	?r!   testname	stdout_fhc                 ^   t          |          }|| f}t          j        |          }|j        |j        }nt          j        g}g |t          j                    dddd|}t          ||dt          j
        dk    t          j                  }t          rd|d<   t          j        |fi |S )	Nz-uz-mztest.regrtestz--worker-argsTnt)stdoutstderrtext	close_fdscwdstart_new_session)varsr$   dumpspythonsys
executabler   args_from_interpreter_flagsdictosnamer	   SAVEDCWDUSE_PROCESS_GROUP
subprocessPopen)r*   r   r+   r'   r&   r8   cmdkws           r   run_test_in_subprocessrC   :   s    2hhGH%K*[))K	yY

n%
)J )<>> ))) ) ) ()C 
7d?
 
 
B  '"&C&&2&&&r!   r(   c                     t          |            t          | |          }t                       t          t          j        |t
                    d           t          j        d           d S )N)clsTflushr   )r   r   printr$   r5   EncodeTestResultr7   exit)r   r(   r   s      r   run_tests_workerrK   W   s[    OOOR##F	GGG 
$*V!1
2
2
2$????HQKKKKKr!   c                   *    e Zd ZdZd Zd Zd Zd ZdS )MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.c                 D    t          j                    | _        || _        d S N)	threadingLocklock
tests_iter)selfrS   s     r   __init__zMultiprocessIterator.__init__h   s    N$$	$r!   c                     | S rO   r#   rT   s    r   __iter__zMultiprocessIterator.__iter__l   s    r!   c                     | j         5  | j        t          t          | j                  cd d d            S # 1 swxY w Y   d S rO   )rR   rS   StopIterationnextrW   s    r   __next__zMultiprocessIterator.__next__o   s    Y 	) 	)&##((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   "7;;c                 T    | j         5  d | _        d d d            d S # 1 swxY w Y   d S rO   )rR   rS   rW   s    r   stopzMultiprocessIterator.stopu   su    Y 	# 	#"DO	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   !!N)__name__
__module____qualname____doc__rU   rX   r\   r^   r#   r!   r   rM   rM   d   sV        BB% % %  ) ) )# # # # #r!   rM   c                   .    e Zd ZU eed<   eed<   eed<   dS )MultiprocessResultr   r.   	error_msgN)r_   r`   ra   r   __annotations__strr#   r!   r   rd   rd   z   s.         KKKNNNNNr!   rd   FTc                       e Zd ZdS )
ExitThreadN)r_   r`   ra   r#   r!   r   ri   ri      s        Dr!   ri   c                        e Zd Zdeddddf fdZdefdZddZdd	Z	 	 dde	dede
fdZdededefdZdede
fdZddZddZdeddfdZ xZS )TestWorkerProcess	worker_idrunnerMultiprocessTestRunnerr   Nc                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        d | _	        d | _
        d | _        d| _        d| _        d S )NF)superrU   rl   pendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)rT   rl   rm   	__class__s      r   rU   zTestWorkerProcess.__init__   sv    "~m),!%r!   c                    d| j          g}|                                 r|                    d           n|                    d           | j        }|r|                    d|            | j        }|Ot          j                    | j        z
  }|                    d| j        j	         dt          |           f           dd                    |          z  S )	NzTestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> )rl   is_aliveappendrv   rx   time	monotonicrw   extendpidr   join)rT   infotestpopendts        r   __repr__zTestWorkerProcess.__repr__   s    6dn667==?? 	#KK	""""KK	"""% 	(KK'''!!DO3BKK1116!4!4668 9 9 9&&r!   c                    | j         }|d S | j        rd S d| _        t          r|  d}n|  }t          d| t          j        d           	 t          r&t          j        |j        t          j
                   d S |                                 d S # t          $ r Y d S t          $ r }t          d| d|           Y d }~d S d }~ww xY w)NTz process groupzKill )filerG   zFailed to kill z: )rx   ry   r>   rH   r7   r/   r;   r   r   signalSIGKILLkillProcessLookupErrorOSErrorr   )rT   r   whatexcs       r   _killzTestWorkerProcess._kill   s
   =F< 	F 	***DD9Dndnn3:T::::	=  	%)V^44444

! 	 	 	 DD 	= 	= 	=;D;;C;;<<<<<<<<<	=s$   +B 9B 
C	C%C  Cc                 <    d| _         |                                  d S )NT)rz   r   rW   s    r   r^   zTestWorkerProcess.stop   s    

r!    test_resultr.   c                 d    t          j                    | j        z
  |_        t	          |||          S rO   )r   r   rw   duration_secrd   )rT   r   r.   err_msgs       r   mp_result_errorz!TestWorkerProcess.mp_result_error   s-     $(>#3#3do#E !+vw???r!   r(   r+   c                    t          j                    | _        || _        	 t	          || j        |          }d| _        || _        n#  d | _         xY w	 | j        r| 	                                 t          	 |                    | j                  }|J ||                                  d | _        d | _        S # t          j        $ r' | j        rt          | 	                                 d }Y nt           $ r | j        rt           w xY wn#  | 	                                  xY w	 |                                  d | _        d | _        d S # |                                  d | _        d | _        w xY w)NFrt   )r   r   rw   rv   rC   r   ry   rx   rz   r   ri   waitrt   _wait_completedr?   TimeoutExpiredr   )rT   r(   r+   r   retcodes        r   _run_processzTestWorkerProcess._run_process   s   .**!*	*9dgyIIE DLDKK	%)D"'	*} ! 

  **T\*::***2   """DK%)D""5 , 
 
 
= % %$ 

     = % %$	 	JJLLL    """DK%)D"""   """DK%)D"))))sG   $A 
A"D 7 B: :3D-D /DD E D##E $E/c                    t           j        dk    rt          j                    }nt           j        j        }t          j        d|          5 }|                     ||          }|	                    d           |
                                                                }d d d            n# 1 swxY w Y   |#|                     t          |          |          S d }|dk    rd|z  }nk|                    d          \  }}}|                                }|sd}n9	 t!          j        |t$                    }n# t&          $ r}	d	|	z  }Y d }	~	nd }	~	ww xY w|$|                     t)          |          ||          S t+          |||          S )
Nr   zw+)encodingr   zExit code %s
zFailed to parse worker stdout)object_hookzFailed to parse worker JSON: %s)r7   platformlocalegetencodingr.   r   tempfileTemporaryFiler   seekreadstripr   r   
rpartitionrstripr$   r%   decode_test_result	Exceptionr   rd   )
rT   r(   r   r+   r   r.   r   _r   r   s
             r   _runtestzTestWorkerProcess._runtest  s   <7"" )++HHz*H #D8<<< 	.	 ''	9==GNN1^^%%++--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ?''	(:(:FCCCa<<$w.GG & 1 1$ 7 7FAv]]__F F9F!Z<NOOOFF  F F F?#EGGGGGGF ''
9(=(=vwOOO!&&':::s+   AB**B.1B.D7 7
EEEc                    | j         s	 	 t          | j                  }n# t          $ r Y d S w xY w|                     |          }| j                            d|f           t          |j        | j	                  rd S nJ# t          $ r Y d S t          $ r1 | j                            dt          j                    f           Y d S w xY w| j         d S d S )NFT)rz   r[   rq   rZ   r   rr   putr    r   r   ri   BaseException	traceback
format_exc)rT   r(   	mp_results      r   runzTestWorkerProcess.run1  s   - 	 $T\ 2 2II$   EE !MM)44		 2333Y-tw77 E       y';'='= >??? - 	 	 	 	 	s.    A> 
-A> -AA> >
C6CCc           	          | j         }	 |                    t                     d S # t          j        t
          f$ r5}t          d|  dt          t                     d|           Y d }~d S d }~ww xY w)NzFailed to wait for z completion (timeout=z): )rx   r   JOIN_TIMEOUTr?   r   r   r   r   )rT   r   r   s      r   r   z!TestWorkerProcess._wait_completedD  s    	&JJ|$$$$$)73 	& 	& 	& % % %&5l&C&C% % % % & & & & & & & & &	&s   % A0*A++A0rw   c                 @   	 |                      d           |                                 sd S t          j                    |z
  }| j                            d|  dt          |                      |t          k    r$t          d|  dt          |                      d S )NTg      ?zWaiting for z thread for zFailed to join z in )	r   r   r   r   ru   logr   r   r   )rT   rw   r   s      r   wait_stoppedzTestWorkerProcess.wait_stoppedN  s    
	IIcNNN==?? !!J.BM ;T ; ;%4R%8%8; ; < < <L  OOO/":M:MOOPPP
	r!   r   N)r   N)r_   r`   ra   intrU   rg   r   r   r^   r   rd   r   r   r   r   r   r   floatr   __classcell__r{   s   @r   rk   rk      ss       # /G D      '# ' ' ' ' = = = =8    	@ @@ @
 
@ @ @ @4*c 4*f 4* 4* 4* 4* 4*l';# ';*< '; '; '; ';R   && & & &u         r!   rk   workersc                     g }| D ]\}|j         }|st          j                    |j        z
  }|t          k    r*|dt          |          d}|                    |           ]|S )Nz ())rv   r   r   rw   r   r   r   )r   r}   workerrv   r   r0   s         r   get_runningr   f  s    G ! !"4  	^ 11""" 1 1 1?23F3F3F3FGDNN4   Nr!   c                   h    e Zd ZdeddfdZddZddZdedz  fdZde	ddfd	Z
d
edefdZddZdS )rn   ru   r   Nc                 N   || _         | j         j        | _        |j        | _        t          j                    | _        t          | j         j                  | _        | j        j	        0t          | j        j	        dz  | j        j	        dz             | _        nd | _        d | _        d S )Ng      ?i,  )ru   r   r   queueQueuerr   rM   testsrq   rt   minrs   r   )rT   ru   s     r   rU   zMultiprocessTestRunner.__init__t  s     =$+05+DM,?@@7?& #&dgo&;&*go&>#@ #@D #'Dr!   c                 |     fdt          d j        j        dz             D              _        dt	           j                   d} j        j        r5|dt           j        j                  dt           j                  dz  }                     |            j        D ]}|	                                 d S )Nc                 0    g | ]}t          |          S r#   )rk   ).0indexrT   s     r   
<listcomp>z8MultiprocessTestRunner.start_workers.<locals>.<listcomp>  s9     C C C! *%66 C C Cr!      zRun tests in parallel using z child processesz (timeout: z, worker timeout: r   )
ranger   use_mpr   lenrt   r   rs   r   start)rT   msgr   s   `  r   start_workersz$MultiprocessTestRunner.start_workers  s    C C C C%*1dgnq.@%A%AC C CPS->->PPP7? 	>C&tw7777&t':;;;;= >C 	l 	 	FLLNNNN	 	r!   c                     t          j                    }| j        D ]}|                                 | j        D ]}|                    |           d S rO   )r   r   r   r^   r   )rT   rw   r   s      r   stop_workersz#MultiprocessTestRunner.stop_workers  sa    ^%%
l 	 	FKKMMMMl 	, 	,F
++++	, 	,r!   c                 >   | j         j        d u}t          }t          d | j        D                       r|rt          j        t          d           	 | j        	                    |          S # t          j        $ r Y nw xY wt          | j                  }|r7| j         j        s+|                     dd                    |          z             t          d | j        D                       	 | j        	                    d          S # t          j        $ r Y d S w xY w)Nc              3   >   K   | ]}|                                 V  d S rO   )r   )r   r   s     r   	<genexpr>z5MultiprocessTestRunner._get_result.<locals>.<genexpr>  s,      ??&//##??????r!   T)rJ   r   zrunning: %s, r   )r   rt   PROGRESS_UPDATEanyr   faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTrr   getr   Emptyr   pgor   r   )rT   use_faulthandlerrt   r}   s       r   _get_resultz"MultiprocessTestRunner._get_result  sG    GO47! ??$,????? 	= =12F7;= = = ={w777;    "$,//G =tw{ =7););;<<< ??$,????? 	="	;??1?---{ 	 	 	44	s$   A- -A?>A?.D	 	DDr   c                    |j         }t          |          }|j        |d|j        z  z  }n6|j        t          k    r&| j        j        s|dt          |j                  z  z  }t          | j	                  }|r'| j        j        s|dd
                    |          z  z  }| j                            | j        |           d S )Nz (%s)z -- running: %sr   )r   rg   re   r   r   r   r   r   r   r   r   ru   display_progress
test_index)rT   r   r   r0   r}   s        r   display_resultz%MultiprocessTestRunner.display_result  s    !6{{*Gi111DD!%666tw{6Gof.ABBBBDdl++ 	;47; 	;%		'(:(:::D&&t=====r!   itemc                 X   |d         r|d         }t          d|            dS | xj        dz  c_        |d         }| j                            |j                   |                     |           |j        rt          |j        d           t          |j        | j	                  rdS dS )z&Returns True if test runner must stop.r   r   zregrtest worker thread failed: TrF   F)
r   r   ru   accumulate_resultr   r   r.   rH   r    r   )rT   r   r   r   s       r   _process_resultz&MultiprocessTestRunner._process_result  s    7 	aJHJHHIII41G	''	(8999I&&& 	0)"$////Y%tw// 	4ur!   c                 0   |                                   d| _        	 	 |                                 }|n|                     |          }|rn0n*# t          $ r t                       d| j        _        Y nw xY w| j        j	        t          j                     | j                                         |                                  d S # | j        j	        t          j                     | j                                         |                                  w xY w)Nr   T)r   r   r   r   KeyboardInterruptrH   ru   interruptedr   rt   r   cancel_dump_traceback_laterrq   r^   r   )rT   r   r^   s      r   	run_testsz MultiprocessTestRunner.run_tests  s+   	 ''))<++D11  ! 	- 	- 	-GGG(,DM%%%	- w*8::: L w*8::: Ls*   1A C $A63C 5A66C ADr   )r_   r`   ra   r   rU   r   r   QueueOutputr   rd   r   boolr   r   r#   r!   r   rn   rn   s  s         d     
 
 
 
, , , ,[4/    8>(: >t > > > >K D    *           r!   rn   ru   c                 H    t          |                                            d S rO   )rn   r   )ru   s    r   run_tests_multiprocessr     s"    8$$..00000r!   c                   <     e Zd ZdZdedeeef         f fdZ xZS )rI   z7Encode a TestResult (sub)class object into a JSON dict.or   c                     t          |t                    r t          |          }|j        j        |d<   |S t                                          |          S )N__test_result__)r   r   r4   r{   r_   rp   default)rT   r   r   r{   s      r   r  zEncodeTestResult.default  sK    a$$ 	!WWF()(<F$%Mwwq!!!r!   )	r_   r`   ra   rb   r   r:   rg   r  r   r   s   @r   rI   rI     sY        AA" "c3h " " " " " " " " " "r!   rI   dc                     d| vr| S |                      d          }t                      D ]}|j        |k    r
 |di | c S dS )z7Decode a TestResult (sub)class object from a JSON dict.r  Nr#   )popget_all_test_result_classesr_   )r  cls_namerE   s      r   r   r      sl     !!uu&''H*,,  <8##38888OOO $ r!   c                  
   d} t           h}t          |          | k    ret          |          } g }|D ])}|                    |                                           *|                    |           t          |          | k    e|S )Nr   )r   r   r   __subclasses__update)
prev_countclassesto_addrE   s       r   r  r    s    JlG
g,,
#
#\\
 	0 	0CMM#,,..////v g,,
#
# Nr!   )Hr   r$   r;   r   r   r?   r7   r   rP   r   r   typingr   r   r   r   r   r   r   test.supportr	   test.libregrtest.cmdliner
   test.libregrtest.mainr   test.libregrtest.runtestr   r   r   r   r   r   r   test.libregrtest.setupr   test.libregrtest.utilsr   r   r   r   r   r   r   hasattrr>   r   r    tuplerg   r)   r@   rC   rK   rM   rd   ExcStrr   r   ri   Threadrk   listr   rn   r   JSONEncoderrI   r:   r   settyper  r#   r!   r   <module>r     s        				       



           = = = = = = = = = = = = = =       " " " " " " . . . . . . * * * * * *Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y . . . . . . A A A A A A A A<7MMM +++++
   .... WR**Dwwr8/D/D j i D    eIsN&;    'S 'i 'F 'zO_ ' ' ' ':	 	s 	x 	 	 	 	# # # # # # # #,        
GEN$667%v@U:VV	 	 	 	 	 	 	 	Z Z Z Z Z	( Z Z Zz
/0 
T:K5L 
 
 
 
z  z  z  z  z  z  z  z z1X 1$ 1 1 1 1	" 	" 	" 	" 	"t' 	" 	" 	"	$sCx. 	Z$sCx.-H 	 	 	 		Sj)9%: 	 	 	 	 	 	r!   