
    z
@h\W                        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Zd dlmZmZmZ d dlmZ d dlmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZm Z 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-m.Z. erd dl/Z/d dl0Z0dZ1e1e#k    sJ dZ2e2e1k    sJ dZ3dZ4 G d d          Z5 ej6        dd           G d d                      Z7e8Z9e:ed         e7f         e:ed         e9f         z  Z; G d de<          Z= G d de<          Z> G d de
j?                  Z@deAe@         de8dz  fdZB G d  d!          ZCdS )"    N)AnyLiteralTextIO)support)	os_helper
MS_WINDOWS   )Logger)
TestResultState)TestResults)RunTestsWorkerRunTestsJsonFileJsonFileType)PROGRESS_MIN_TIME)StrPathTestNameformat_durationprint_warningcountpluralget_signal_name)create_worker_processUSE_PROCESS_GROUPg      >@g     r@g      N@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)selfr#   s     3/usr/lib/python3.11/test/libregrtest/run_workers.py__init__zMultiprocessIterator.__init__8   s    N$$	$    c                     | S r    r$   s    r%   __iter__zMultiprocessIterator.__iter__<   s    r'   c                     | j         5  | j        t          t          | j                  cd d d            S # 1 swxY w Y   d S r   )r"   r#   StopIterationnextr*   s    r%   __next__zMultiprocessIterator.__next__?   s    Y 	) 	)&##((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   "7;;c                 T    | j         5  d | _        d d d            d S # 1 swxY w Y   d S r   )r"   r#   r*   s    r%   stopzMultiprocessIterator.stopE   su    Y 	# 	#"DO	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   !!N)__name__
__module____qualname____doc__r&   r+   r/   r1   r)   r'   r%   r   r   4   sV        BB% % %  ) ) )# # # # #r'   r   T)slotsfrozenc                   B    e Zd ZU eed<   dZedz  ed<   dZedz  ed<   dS )MultiprocessResultresultNworker_stdouterr_msg)r2   r3   r4   r   __annotations__r;   strr<   r)   r'   r%   r9   r9   J   sF          $M3:$$$GS4Zr'   r9   Fc                       e Zd ZdS )
ExitThreadN)r2   r3   r4   r)   r'   r%   r@   r@   V   s        Dr'   r@   c                   <     e Zd Zdededz  dedz  def fdZ xZS )WorkerError	test_namer<   Nstdoutstatec                     t          ||          }t          |||          | _        t                                                       d S )NrE   )r   r9   	mp_resultsuperr&   )r$   rC   r<   rD   rE   r:   	__class__s         r%   r&   zWorkerError.__init__[   sF    
 IU333+FFGDDr'   )r2   r3   r4   r   r>   r&   __classcell__rJ   s   @r%   rB   rB   Z   si        $* t 	         r'   rB   c            
       r    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
dz  dedz  fdZdej        defdZdej        deeedz  f         fdZdedede	fdZde	dedeedz  ee
         f         fdZdedefdZdededz  dedeeef         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 )#WorkerThread	worker_idrunner
RunWorkersreturnNc                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        d | _	        d | _
        d | _        d| _        d| _        d S )NF)rI   r&   rO   runtestspendingoutputworker_timeouttimeoutlogrC   
start_time_popen_killed_stopped)r$   rO   rP   rJ   s      r%   r&   zWorkerThread.__init__f   su    "~m,:*.(,48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WorkerThread #runningstoppedztest=zpid=ztime=z<%s> )rO   is_aliveappendrC   r[   time	monotonicrZ   extendpidr   join)r$   infotestpopendts        r%   __repr__zWorkerThread.__repr__t   s    1112==?? 	#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|  d}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 processzKill )fileflushzFailed to kill z: )r[   r\   r   printsysstderroskillpgrg   signalSIGKILLkillProcessLookupErrorOSErrorr   )r$   rk   whatexcs       r%   _killzWorkerThread._kill   s   =F< 	F 	%***DD$$$Dndnn3:T::::	=  	%)V^44444

! 	 	 	 DD 	= 	= 	=;D;;C;;<<<<<<<<<	=s$   +B ;B 
C	C'CCc                 <    d| _         |                                  d S )NT)r]   r}   r*   s    r%   r1   zWorkerThread.stop   s    

r'   rT   	output_fdtmp_dirc                 T   t          |||          }|| _        d| _        	 | j        r|                                  t
          	 |                    | j                  }|J ||                                  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 S # |                                  d | _        w xY w)NFrX   )r   r[   r\   r]   r}   r@   waitrX   _wait_completed
subprocessTimeoutExpiredrz   )r$   rT   r   r   rk   retcodes         r%   _run_processzWorkerThread._run_process   sj   %h	7CC&	} ! 

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

     = % %$	 	JJLLL    """DKKK   """DKs;   "C  B   3C3C 5CC D
 C))D
 
D'stackc                     t           rt          j                    }nt          j        j        }t          j        d|d          }|                    |           |S )z/Create stdout temporary file (file descriptor).w+backslashreplace)encodingerrors)	r   localegetencodingrr   rD   r   tempfileTemporaryFileenter_context)r$   r   r   stdout_files       r%   create_stdoutzWorkerThread.create_stdout   sh      	+ )++HHz*H ,T6>4FH H H 	K(((r'   c                    | j                                         }|rt          dt          j                  }d}nt          j        dd          }|                    |           |                                }t          r/t          j        |          }t          |t          j                  }nt          |t          j                  }||fS )zCreate JSON file.Nr   utf8r   )rT   json_file_use_stdoutr   r   STDOUTr   r   r   filenor   msvcrtget_osfhandleWINDOWS_HANDLEUNIX_FD)r$   r   r   	json_filejson_tmpfilejson_fdjson_handles          r%   create_json_filezWorkerThread.create_json_file   s      $}AACC 	D |':;;ILL#1$HHHL---"))++G D $*#7#@#@$[%1%@B B		 %Wl.BCC	<((r'   rC   r   c                     |f}| j         j        r| j                             |          }nd }i }|rd |D             |d<   | j         j        r
d|d<   d|d<    | j         j        d||d|S )	Nc                     g | ]}|d fS )Tr)   ).0rj   s     r%   
<listcomp>z7WorkerThread.create_worker_runtests.<locals>.<listcomp>  s    $J$J$JddD\$J$J$Jr'   match_testsTverboseFoutput_on_failure)testsr   r)   )rT   rerunget_match_testsr   create_worker_runtests)r$   rC   r   r   r   kwargss         r%   r   z#WorkerThread.create_worker_runtests   s    = 	-77	BBKKK!# 	K$J$Jk$J$J$JF=!=* 	0 $F9*/F&'3t}3     	r'   worker_runtests	stdout_fdc                    t           j        st          j        d          }t          j                            |          }	 |                     |||          }t	          j        |          }t          j
        |           nE# t	          j        |          }t          j
        |           w xY w|                     ||          }g }||fS )Ntest_python_)prefix)r   is_wasir   mkdtemprt   pathabspathr   listdirr   rmtree)r$   r   r   r   r   	tmp_filess         r%   run_tmp_fileszWorkerThread.run_tmp_files  s    
  	 &n===Ggoog..G*++O,5w@ @ Jw//	 )))) Jw//	 ))))''CCGI##s   B *B,r   c                     |                     d           	 |                                                                S # t          $ r*}t	          | j        d| d t          j                  d }~ww xY w)Nr   zCannot read process stdout: )rD   rE   )seekreadstrip	ExceptionrB   rC   r   
WORKER_BUG)r$   r   r|   s      r%   read_stdoutzWorkerThread.read_stdout(  s    	6##%%++--- 	6 	6 	6 dnBSBB%)$)$46 6 6 6	6s   %= 
A1%A,,A1r   rD   c                    	 |*|                     d           |                                }n|j        t          j        k    r.|                    d          \  }}}|                                }nB|                    d          5 }|                                }d d d            n# 1 swxY w Y   n9# t          $ r,}d| }t          | j
        ||t          j                  d }~ww xY w|s"t          | j
        d|t          j                  	 t          j        |          }	n9# t          $ r,}d| }t          | j
        ||t          j                  d }~ww xY w|	|fS )	Nr   
r   r   z$Failed to read worker process JSON: rG   z
empty JSONz%Failed to parse worker process JSON: )r   r   	file_typer   r   
rpartitionrstripopenr   rB   rC   r   r   r   	from_json)
r$   r   r   rD   worker_json_json_fpr|   r<   r:   s
             r%   	read_jsonzWorkerThread.read_json4  s   	6'!!!$$$*//11$(;;;)/):):4)@)@&;^^V^44 1"),,..K1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 	6 	6 	6 CSBBGdngv$)$46 6 6 6		6  	6dnlF$)$46 6 6 6	6)+66FF 	6 	6 	6 DcCCGdngv$)$46 6 6 6		6 sT   BB4 B(B4 (B,,B4 /B,0B4 4
C*>'C%%C*D' '
E1'EEc           
      (   t          j                    5 }|                     |          }|                     |          \  }}|                     ||          }|                     ||                                          \  }}|                     |          }	|"t          | j	        |	d t          j                  |dk    r>t          |          }
|
r| d|
 d}t          | j	        d| |	t          j                  |                     |||	          \  }}	d d d            n# 1 swxY w Y   |rQd| dt          |           d	d
                    t#          |                     }|	|z  }	|                                 t'          ||	          S )N)rD   r<   rE   r    ()z
Exit code rG   z

Warning -- z leaked temporary files (): , )
contextlib	ExitStackr   r   r   r   r   r   rB   rC   r   TIMEOUTr   WORKER_FAILEDr   lenrh   sortedset_env_changedr9   )r$   rC   r   r   r   r   r   r   r   rD   namer:   msgs                r%   _runtestzWorkerThread._runtestV  s&   !## 	Mu,,U33K&*&;&;E&B&B#I|"99)YOOO "&!3!3O4?4F4F4H4H"J "JGY %%k22F!$.*.(-7 7 7 7 !||&w// 4!(33D333G!$.2Hw2H2H&(-(;= = = = "^^I|VLLNFF-	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M0  	%I!*I I9~~I I*.))F94E4E*F*FI IC cMF""$$$!&&111s   DD&&D*-D*c                    | j         j        }| j         j        }| j        sC	 	 t	          | j                  }n# t          $ r Y d S w xY wt          j                    | _	        || _
        	 |                     |          }n# t          $ r}|j        }Y d }~nd }~ww xY wd | _
        n# d | _
        w xY wt          j                    | j	        z
  |j        _        | j                            d|f           |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        Ad S d S )NFT)rT   	fail_fastfail_env_changedr]   r.   rU   r-   rd   re   rZ   rC   r   rB   rH   r:   durationrV   put	must_stopr@   BaseException	traceback
format_exc)r$   r   r   rC   rH   r|   s         r%   runzWorkerThread.runx  s   M+	=9- 	 $T\ 2 2II$   EE #'."2"2!** $i 8 8II" . . . #IIIIII. &*DNNTDN)))),0N,<,<t,N	 )	 2333#--i9IJJ E       y';'='= >???- - 	 	 	 	 	so   8 D 
AD A"D )A? >B% ?
B	BB% BB% D %	B..AD 
E6EE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=r   )r[   r   WAIT_COMPLETED_TIMEOUTr   r   rz   r   r   )r$   rk   r|   s      r%   r   zWorkerThread._wait_completed  s    	&JJ-.....)73 	& 	& 	& % % %&56L&M&M% % % % & & & & & & & & &	&s   % A0*A++A0rZ   c                 6   	 |                      d           |                                 sd S t          j                    |z
  }|                     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 )rh   rb   rd   re   rY   r   WAIT_KILLED_TIMEOUTr   )r$   rZ   rl   s      r%   wait_stoppedzWorkerThread.wait_stopped  s    		IIcNNN==?? !!J.BHHKDKKob6I6IKKLLL'''OOO/":M:MOOPPP		r'   rR   Nr   )!r2   r3   r4   intr&   r>   rm   r}   r1   r   r   r   r   r   r   r   tupler   r   r   r   listr   r   r   r   r9   r   r   r   floatr   rK   rL   s   @r%   rN   rN   e   sj       # |       '# ' ' ' ' = = = =8    04, ,^ , ,%n,8;d
, , , ,\:#7 F    ,)j&: )uXvX\}E\?] ) ) ) ), X R`    $$^ $!$$).sTz4=/H)I$ $ $ $.
6v 
6# 
6 
6 
6 
6  8   6D=     "'
C"8           D 2(  2/A  2  2  2  2D   :& & & &u         r'   rN   workersrR   c                    g }| D ]\}|j         }|st          j                    |j        z
  }|t          k    r*| dt          |           d}|                    |           ]|sd S dt          |           dd                    |           S )Nr   r   z	running (r   r   )	rC   rd   re   rZ   r   r   rc   r   rh   )r   r_   workerrC   rl   texts         r%   get_runningr     s    G ! !$	 	^ 11"""99?2#6#6999DNN4    t<s7||<<		'(:(:<<<r'   c            
       t    e Zd Zdedede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 )rQ   num_workersrT   loggerresultsrR   Nc                    || _         || _        |j        | _        |j        | _        || _        t          j                    | _        |                                }t          |          | _
        |j        | _        | j        &t          | j        dz  | j        dz             | _        nd | _        d | _        | j                                        }|t          | j         |          | _         d S d S )Ng      ?i,  )r   rT   rY   display_progressr   queueQueuerV   
iter_testsr   rU   rX   minrW   r   get_jobs)r$   r   rT   r   r   r#   jobss          r%   r&   zRunWorkers.__init__  s    & : & 7$+05((**
+J77'<# 14DL34FW]H]0^0^D"&D26}%%''  #4#3T::D r'   c                      fdt          d j        dz             D              _         j                                        }|t          |d          }nd}t           j                  }t          |dd          }d| d| d	| } j        r0|d
t           j                  dt           j
                  dz  }                     |            j        D ]}|                                 d S )Nc                 0    g | ]}t          |          S r)   )rN   )r   indexr$   s     r%   r   z,RunWorkers.start_workers.<locals>.<listcomp>  s9     E E E! %UD11 E E Er'   r	   rj   r   process	processeszRun z in parallel using z worker z (timeout: z, worker timeout: r   )ranger   r   rT   r  r   r   r   rX   r   rW   rY   start)r$   r  r   nworkersr  r   r   s   `      r%   start_workerszRunWorkers.start_workers  s?   E E E E%*1d.>.B%C%CE E E}%%''$''EEEt|$$8Y<<	0e 0 00 0$-0 0< 	>C&t|4444&t':;;;;= >C 	l 	 	FLLNNNN	 	r'   c                     t          j                    }| j        D ]}|                                 | j        D ]}|                    |           d S r   )rd   re   r   r1   r   )r$   rZ   r   s      r%   stop_workerszRunWorkers.stop_workers  sa    ^%%
l 	 	FKKMMMMl 	, 	,F
++++	, 	,r'   c                    | j         j        }| j        d u}t          d | j        D                       r|rt          j        t          d           	 | j        	                    t                    S # t          j        $ r Y nw xY w|s+t          | j                  }|r|                     |           t          d | j        D                       	 | j        	                    d          S # t          j        $ r Y d S w xY w)Nc              3   >   K   | ]}|                                 V  d S r   )rb   )r   r   s     r%   	<genexpr>z)RunWorkers._get_result.<locals>.<genexpr>  s,      ??&//##??????r'   T)exitr   r   )rT   pgorX   anyr   faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTrV   getPROGRESS_UPDATEr   Emptyr   rY   )r$   r  use_faulthandlerr_   s       r%   _get_resultzRunWorkers._get_result  s6   m L4 ??$,????? 	& =12F7;= = = ={???;     &%dl33 &HHW%%% ??$,????? 	&$	;??1?---{ 	 	 	44	s$   A2 2BBC. .D DrH   c                 B   |j         }| j        j        }t          |          }|j        r|d|j        z  z  }n,|j        t          k    r|s|dt          |j                  z  z  }|st          | j	                  }|r|d| z  }| 
                    | j        |           d S )Nz (%s)z -- )r:   rT   r  r>   r<   r   r   r   r   r   r   
test_index)r$   rH   r:   r  r   r_   s         r%   display_resultzRunWorkers.display_result  s    !m6{{ 	?Gi///DDo!22232Gofo>>>>D 	)!$,//G )(w(((dot44444r'   itemc                    |d         rW|d         }t          d|            t          dt          j                  }| j                            || j                   |S | xj        dz  c_        |d         }|j        }| j                            || j                   | 	                    |           | j        j
        sd}n|j        t          j        k    }|r|j        }|rt          |d           |S )z&Returns True if test runner must stop.r   r	   zregrtest worker thread failed: z<regrtest worker>rG   T)rp   )r   r   r   r   r   accumulate_resultrT   r  r:   r  r   rE   PASSEDr;   rq   )r$   r   r   r:   rH   show_stdoutrD   s          r%   _process_resultzRunWorkers._process_result)  s   7 	aJHJHHIII 35;KLLLFL**64=AAAM1G	!&&vt}===I&&& }. 	9KK "<5<7K 	*,F *fD))))r'   c                 t   | j         j        }| j         j        }|                                  d| _        	 	 |                                 }|n-|                     |          }|                    ||          rnDn*# t          $ r t                       d| j
        _        Y nw xY w| j        t          j                     | j                                         |                                  d S # | j        t          j                     | j                                         |                                  w xY w)Nr   T)rT   r   r   r  r  r  r%  r   KeyboardInterruptrq   r   interruptedrX   r  cancel_dump_traceback_laterrU   r1   r  )r$   r   r   r   r:   s        r%   r   zRunWorkers.runF  sM   M+	=9	 ''))<--d33##I/?@@  ! 	, 	, 	,GGG'+DL$$$	, |'8::: L |'8::: Ls+   AA; :C. ;$B"C. !B""C. .A	D7r   )r2   r3   r4   r   r   r
   r   r&   r  r  QueueOutputr  r9   r  r   r%  r   r)   r'   r%   rQ   rQ     s        ;C ;8 ;;*5;:>; ; ; ;6   (, , , ,[4/    :5(: 5t 5 5 5 5 K J    :           r'   rQ   )Dr   dataclassesr  os.pathrt   r   rv   r   rr   r   r    rd   r   typingr   r   r   rj   r   test.supportr   r   r   r
   r:   r   r   r   r   rT   r   r   r   r   singler   utilsr   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   	dataclassr9   r>   ExcStrr   r*  r   r@   rB   ThreadrN   r   r   rQ   r)   r'   r%   <module>r4     s                      



           ' ' ' ' ' ' ' ' ' '       . . . . . . . .       % % % % % % % %             F F F F F F F F F F F F % % % % % %D D D D D D D D D D D D D D D D D D = < < < < < < < MMMMMM
 +++++
   ....    # # # # # # # #, T$///       0/ 
GEN$667%v@U:VV	 	 	 	 	 	 	 	    )   N N N N N9# N N Nb
=l+ =d
 = = = =[  [  [  [  [  [  [  [  [  [ r'   