
    8bh\W                     B   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Z1dZ2dZ3dZ4 G d d      Z5 ejl                  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!      ZCy)"    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y)MultiprocessIteratorc                 D    t        j                         | _        || _        y N)	threadingLocklock
tests_iter)selfr#   s     F/opt/python-3.12.12/usr/lib/python3.12/test/libregrtest/run_workers.py__init__zMultiprocessIterator.__init__8   s    NN$	$    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 Y   y xY wr   )r"   r#   StopIterationnextr*   s    r%   __next__zMultiprocessIterator.__next__?   s/    YY&##( YYs	   '>Ac                 T    | j                   5  d | _        d d d        y # 1 sw Y   y xY wr   )r"   r#   r*   s    r%   stopzMultiprocessIterator.stopE   s    YY"DO YYs   'N)__name__
__module____qualname__r&   r+   r/   r1   r)   r'   r%   r   r   4   s    B%)#r'   r   T)slotsfrozenc                   @    e Zd ZU eed<   dZedz  ed<   dZedz  ed<   y)MultiprocessResultresultNworker_stdouterr_msg)r2   r3   r4   r   __annotations__r:   strr;   r)   r'   r%   r8   r8   J   s$     $M3:$GS4Zr'   r8   Fc                       e Zd Zy)
ExitThreadN)r2   r3   r4   r)   r'   r%   r?   r?   V   s    r'   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        |           y )NrD   )r   r8   	mp_resultsuperr&   )r$   rB   r;   rC   rD   r9   	__class__s         r%   r&   zWorkerError.__init__[   s,    
 IU3+FFGDr'   )r2   r3   r4   r   r=   r&   __classcell__rI   s   @r%   rA   rA   Z   s9    $* t 	 r'   rA   c            
       n    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| _        y )NF)rH   r&   rN   runtestspendingoutputworker_timeouttimeoutlogrB   
start_time_popen_killed_stopped)r$   rN   rO   rI   s      r%   r&   zWorkerThread.__init__f   sq    "~~mm,,::*.(,48r'   c                    d| j                    g}| j                         r|j                  d       n|j                  d       | j                  }|r|j                  d|        | j                  }|Wt        j                         | j                  z
  }|j                  d| j                  j                   dt        |       f       ddj                  |      z  S )	NzWorkerThread #runningstoppedztest=zpid=ztime=z<%s> )rN   is_aliveappendrB   rZ   time	monotonicrY   extendpidr   join)r$   infotestpopendts        r%   __repr__zWorkerThread.__repr__t   s      012==?KK	"KK	"~~KK%v'!DOO3BKK401 !4 568 9&&r'   c                    | j                   }|y | j                  ry d| _        t        r|  d}n|  d}t        d| t        j
                  d       	 t        r/t        j                  |j                  t        j                         y |j                          y # t        $ r Y y t        $ r}t        d| d|       Y d }~y d }~ww xY w)NTz process groupz processzKill )fileflushzFailed to kill z: )rZ   r[   r   printsysstderroskillpgrf   signalSIGKILLkillProcessLookupErrorOSErrorr   )r$   rj   whatexcs       r%   _killzWorkerThread._kill   s    =<<V>*DV8$DdVn3::T:	= 		%))V^^4

! 	  	=OD6C7;<<	=s$   4B 
B 	C	&C	.CC	c                 2    d| _         | j                          y )NT)r\   r|   r*   s    r%   r1   zWorkerThread.stop   s    

r'   rS   	output_fdtmp_dirc                 2   t        |||      }|| _        d| _        	 | j                  r| j	                          t
        	 |j                  | j                        }|| j                          d | _        S # t        j                  $ r' | j                  rt
        | j	                          d }Y nt        $ r | j                  rt
         w xY wn#  | j	                           xY w	 | j                          d | _        y # | j                          d | _        w xY w)NFrW   )r   rZ   r[   r\   r|   r?   waitrW   _wait_completed
subprocessTimeoutExpiredry   )r$   rS   r~   r   rj   retcodes         r%   _run_processzWorkerThread._run_process   s	   %h	7C&	}} 

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

   == %$	 	JJL    "DK   "DKs;   "C  A5 57C
,C .C

C C= C!!C= =Dstackc                     	 t         rt        j                         }nt        j                  j
                  }t        j                  d|d      }|j                  |       |S )Nw+backslashreplace)encodingerrors)	r   localegetencodingrq   rC   r   tempfileTemporaryFileenter_context)r$   r   r   stdout_files       r%   create_stdoutzWorkerThread.create_stdout   sX    = ))+Hzz**H ,,T6>4FH 	K(r'   c                    	 | j                   j                         }|r t        d t        j                        }d }||fS t        j                  dd      }|j                  |       |j                         }t        r3t        j                  |      }t        |t        j                        }||fS t        |t        j                        }||fS )Nr   utf8r   )rS   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 |':':;IL <(( $11$HL-"))+G $*#7#7#@$[%1%@%@B	 <(( %Wl.B.BC	<((r'   rB   r   c                 *   |f}| j                   j                  r| j                   j                  |      }nd }i }|r|D cg c]  }|df c}|d<   | j                   j                  r
d|d<   d|d<    | j                   j                  d||d|S c c}w )NTmatch_testsverboseFoutput_on_failure)testsr   r)   )rS   rerunget_match_testsr   create_worker_runtests)r$   rB   r   r   r   kwargsri   s          r%   r   z#WorkerThread.create_worker_runtests   s    ==--77	BKK!#>I$JkddD\k$JF=!==** $F9*/F&'3t}}33   		 %Ks    Bworker_runtests	stdout_fdc                    t         j                  swt        j                  d      }t        j
                  j                  |      }	 | j                  |||      }t	        j                  |      }t        j                  |       ||fS | j                  ||      }g }||fS # t	        j                  |      }t        j                  |       w xY w)Ntest_python_)prefix)r   is_wasir   mkdtemprs   pathabspathr   listdirr   rmtree)r$   r   r   r   r   	tmp_filess         r%   run_tmp_fileszWorkerThread.run_tmp_files  s    
  &&n=Gggoog.G*++O,5w@ JJw/	  )
 ## ''CGI## JJw/	  )s   B   ,Cr   c                     |j                  d       	 |j                         j                         S # t        $ r/}t	        | j
                  d| d t        j                        d }~ww xY w)Nr   zCannot read process stdout: )rC   rD   )seekreadstrip	ExceptionrA   rB   r   
WORKER_BUG)r$   r   r{   s      r%   read_stdoutzWorkerThread.read_stdout(  sh    	6##%++-- 	6 dnn <SEB%)$)$4$46 6	6s   1 	A)*A$$A)r   rC   c                    	 |"|j                  d       |j                         }nn|j                  t        j                  k(  r&|j                  d      \  }}}|j                         }n+|j                  d      5 }|j                         }d d d        s't        | j                  d|t        j                        	 t        j                  |      }	|	|fS # 1 sw Y   LxY w# t        $ r1}d| }t        | j                  ||t        j                        d }~ww xY w# t        $ r1}d| }t        | j                  ||t        j                        d }~ww xY w)	Nr   
r   r   z$Failed to read worker process JSON: rF   z
empty JSONz%Failed to parse worker process JSON: )r   r   	file_typer   r   
rpartitionrstripopenr   rA   rB   r   r   r   	from_json)
r$   r   r   rC   worker_json_json_fpr{   r;   r9   s
             r%   	read_jsonzWorkerThread.read_json4  sK   	6'!!!$*//1$$(;(;;)/):):4)@&;^^V^4"),,.K 5 dnnlF$)$4$46 6	6))+6F - 54 	6 =SEBGdnngv$)$4$46 6		6  	6 >cUCGdnngv$)$4$46 6		6sH   A9C# ;CC# >D  C C# #	D,,DD 	E),EEc           
         t        j                         5 }| j                  |      }| j                  |      \  }}| j	                  ||      }| j                  ||j                               \  }}| j                  |      }	|'t        | j                  |	d t        j                        |dk7  r?t        |      }
|
r| d|
 d}t        | j                  d| |	t        j                        | j                  |||	      \  }}	d d d        rAd| dt        |       d	d
j!                  t#        |             }	|z  }	j%                          t'        	      S # 1 sw Y   XxY w)N)rC   r;   rD   r    ()z
Exit code rF   z

Warning -- z leaked temporary files (): , )
contextlib	ExitStackr   r   r   r   r   r   rA   rB   r   TIMEOUTr   WORKER_FAILEDr   lenrg   sortedset_env_changedr8   )r$   rB   r   r   r   r   r   r   r   rC   namer9   msgs                r%   _runtestzWorkerThread._runtestV  sw   !!#u,,U3K&*&;&;E&B#I|"99)YOO "&!3!3O4?4F4F4H"JGY %%k2F!$..*.(-7 7 !|&w/!(	D63G!$..Jwi2H&(-(;(;= = "^^I|VLNFF- $0 !!* ,9~&c$))F94E*F)GIC cMF""$!&&11? $#s   C/EE$c                    | j                   j                  }| j                   j                  }| j                  s	 	 t	        | j
                        }t        j                         | _	        || _
        	 | j                  |      }d | _
        t        j                         | j                  z
  |j                  _        | j                   j#                  d|f       |j                  j%                  ||      ry 	 | j                  sy y # t        $ r Y y w xY w# t        $ r}|j                  }Y d }~d }~ww xY w# d | _
        w xY w# t&        $ r Y y t(        $ r2 | j                   j#                  dt+        j,                         f       Y y w xY w)NFT)rS   	fail_fastfail_env_changedr\   r.   rT   r-   rc   rd   rY   rB   r   rA   rG   r9   durationrU   put	must_stopr?   BaseException	traceback
format_exc)r$   r   r   rB   rG   r{   s         r%   runzWorkerThread.runx  sC   MM++	==99-- $T\\ 2I #'.."2!** $i 8I &*DN,0NN,<t,N	  )	 23##--i9IJ K% -- %  # . #I. &*DN    y';';'= >?sl   D  E  1D A0E  	DE  DE  	D1D,'D4 ,D11D4 4	D==E   	F7FFc           	          | j                   }	 |j                  t               y # t        j                  t
        f$ r+}t        d|  dt        t               d|       Y d }~y d }~ww xY w)NzFailed to wait for z completion (timeout=r   )rZ   r   WAIT_COMPLETED_TIMEOUTr   r   ry   r   r   )r$   rj   r{   s      r%   r   zWorkerThread._wait_completed  si    	&JJ-.))73 	&/v 6&&56L&M%Nc G% & &	&s   $ A(!A##A(rY   c                     	 | j                  d       | j                         sy t        j                         |z
  }| j	                  d|  dt        |              |t        kD  rt        d|  dt        |              y ~)Ng      ?zWaiting for z thread for zFailed to join z in )rg   ra   rc   rd   rX   r   WAIT_KILLED_TIMEOUTr   )r$   rY   rk   s      r%   wait_stoppedzWorkerThread.wait_stopped  sz     IIcN==?!J.BHH|D6ob6I5JKL''vT/":M9NOP r'   rQ   Nr   )!r2   r3   r4   intr&   r=   rl   r|   r1   r   r   r   r   r   r   r   tupler   r   r   r   listr   r   r   r   r8   r   r   r   floatr   rJ   rK   s   @r%   rM   rM   e   sd   # |  '# ' =8 04,^ , ,%n,8;d
,\:#7#7 F ,)j&:&: )uXvX\}E\?] ), X R` $$^ $!$$).sTz4=/H)I$.
6v 
6# 
6  8   6D=     "'
C"8  D 2(  2/A  2D:&u  r'   rM   workersrQ   c                    g }| D ]^  }|j                   }|st        j                         |j                  z
  }|t        k\  s=| dt        |       d}|j                  |       ` |sy dt        |       ddj                  |       S )Nr   r   z	running (r   r   )	rB   rc   rd   rY   r   r   rb   r   rg   )r   r^   workerrB   rk   texts         r%   get_runningr     s    G$$	^^ 1 11""[?2#6"7q9DNN4   s7|nC		'(:';<<r'   c            
       r    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y)rP   num_workersrS   loggerresultsrQ   Nc                    || _         || _        |j                  | _        |j                  | _        || _        t        j                         | _        |j                         }t        |      | _
        |j                  | _        | j                  ,t        | j                  dz  | j                  dz         | _        nd | _        d | _        | j                  j                         }|t        | j                   |      | _         y y )Ng      ?i,  )r   rS   rX   display_progressr   queueQueuerU   
iter_testsr   rT   rW   minrV   r   get_jobs)r$   r   rS   r   r   r#   jobss          r%   r&   zRunWorkers.__init__  s    & :: & 7 7$+05((*
+J7''<<# 14DLL34FW]H]0^D"&D26}}%%'  #4#3#3T:D r'   c                 
   t        d| j                  dz         D cg c]  }t        ||        c}| _        | j                  j                         }|t        |d      }nd}t        | j                        }t        |dd      }d| d| d| }| j                  r2|d	t        | j                        d
t        | j                        dz  }| j                  |       | j                  D ]  }|j                           y c c}w )Nr	   ri   r   process	processeszRun z in parallel using z worker z (timeout: z, worker timeout: r   )ranger   rM   r   rS   r   r   r   r   rW   r   rV   rX   start)r$   indexr   r   nworkersr  r   r   s           r%   start_workerszRunWorkers.start_workers  s    %*1d.>.>.B%CE%CE %UD1%CE}}%%'$'EEt||$8Y<	eW/8I;0<<&t||4&t':':;= >C 	llFLLN #!Es   D c                     t        j                         }| j                  D ]  }|j                           | j                  D ]  }|j	                  |        y r   )rc   rd   r   r1   r   )r$   rY   r   s      r%   stop_workerszRunWorkers.stop_workers  sA    ^^%
llFKKM #llF
+ #r'   c                 ,   | j                   j                  }| j                  d u}t        d | j                  D              r>|rt        j                  t        d       	 | j                  j                  t              S 	 | j                  j                  d      S # t        j                  $ r Y nw xY w|s(t        | j                        }|r| j                  |       t        d | j                  D              r~# t        j                  $ r Y y w xY w)Nc              3   <   K   | ]  }|j                           y wr   )ra   ).0r   s     r%   	<genexpr>z)RunWorkers._get_result.<locals>.<genexpr>  s     ?,&//#,s   T)exitr   r   )rS   pgorW   anyr   faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTrU   getPROGRESS_UPDATEr   Emptyr   rX   )r$   r  use_faulthandlerr^   s       r%   _get_resultzRunWorkers._get_result  s    mm LL4 ?$,,??112F7;={{??	;;??1?-- ;;  %dll3HHW% ?$,,??( {{ 		s$   B  C= B21B2=DDrG   c                 v   |j                   }| j                  j                  }t        |      }|j                  r|d|j                  z  z  }n0|j
                  t        k\  r|s|dt        |j
                        z  z  }|st        | j                        }|r|d| z  }| j                  | j                  |       y )Nz (%s)z -- )r9   rS   r  r=   r;   r   r   r   r   r   r   
test_index)r$   rG   r9   r  r   r^   s         r%   display_resultzRunWorkers.display_result  s    !!mm6{Gi////Doo!223Gofoo>>>D!$,,/G$wi((doot4r'   itemc                    	 |d   rV|d   }t        d|        t        dt        j                        }| j                  j                  || j                         |S | xj                  dz  c_        |d   }|j                  }| j                  j                  || j                         | j                  |       | j                  j                  sd}n|j                  t        j                  k7  }|r|j                  }|rt        |d       |S )Nr   r	   zregrtest worker thread failed: z<regrtest worker>rF   T)ro   )r   r   r   r   r   accumulate_resultrS   r  r9   r  r   rD   PASSEDr:   rp   )r$   r  r   r9   rG   show_stdoutrC   s          r%   _process_resultzRunWorkers._process_result)  s    47aJ;J<HI 35;K;KLFLL**64==AM1G	!!&&vt}}=I& }}..K "<<5<<7K,,FfD)r'   c                    | j                   j                  }| j                   j                  }| j                          d| _        	 	 | j                         }|n%| j                  |      }|j                  ||      rn8| j                  t        j                          | j                  j!                          | j#                          y # t        $ r t                d| j                  _        Y qw xY w# | j                  t        j                          | j                  j!                          | j#                          w xY w)Nr   T)rS   r   r   r  r  r  r!  r   KeyboardInterruptrp   r   interruptedrW   r  cancel_dump_traceback_laterrT   r1   r	  )r$   r   r   r  r9   s        r%   r   zRunWorkers.runF  s
   MM++	==99	 '')<--d3##I/?@  ||'88: LL ! 	,G'+DLL$	, ||'88: LLs%   9C	 	$C0-C3 /C00C3 3AD?r   )r2   r3   r4   r   r   r
   r   r&   r  r	  QueueOutputr  r8   r  r   r!  r   r)   r'   r%   rP   rP     st    ;C ;8 ;;*5;:>;6(,[4/ :5(: 5t 5 K J : r'   rP   )Dr   dataclassesr  os.pathrs   r   ru   r   rq   r   r    rc   r   typingr   r   r   ri   r   test.supportr   r   r   r
   r9   r   r   r   r   rS   r   r   r   r   singler   utilsr   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   	dataclassr8   r=   ExcStrr   r&  r   r?   rA   ThreadrM   r   r   rP   r)   r'   r%   <module>r0     s;          
     ' '  .  %   F F %D D D =
        # #, T$/  0 
GEN$667%v@U:VV	 	) N9## Nb
=l+ =d
 =[  [ r'   