
    daf\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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d Zy)MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.c                 D    t        j                         | _        || _        y N)	threadingLocklock
tests_iter)selfr#   s     7/root/Python-3.12.4/Lib/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 	)&##(	) 	) 	)s	   '>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	# 	# 	#s   'N)__name__
__module____qualname____doc__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%   r9   r9   J   s$     $M3:$GS4Zr'   r9   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rE   )r   r9   	mp_resultsuperr&   )r$   rC   r<   rD   rE   r:   	__class__s         r%   r&   zWorkerError.__init__[   s,    
 IU3+FFGDr'   )r2   r3   r4   r   r>   r&   __classcell__rJ   s   @r%   rB   rB   Z   s9    $* t 	 r'   rB   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)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   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> )rO   is_aliveappendrC   r[   time	monotonicrZ   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: )r[   r\   r   printsysstderroskillpgrg   signalSIGKILLkillProcessLookupErrorOSErrorr   )r$   rk   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'   rT   	output_fdtmp_dirc                 :   t        |||      }|| _        d| _        	 | j                  r| j	                          t
        	 |j                  | 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rX   )r   r[   r\   r]   r}   r@   waitrX   _wait_completed
subprocessTimeoutExpiredrz   )r$   rT   r   r   rk   retcodes         r%   _run_processzWorkerThread._run_process   s   %h	7C&	}} 

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

   == %$	 	JJL    "DK   "DKs;   "C  !A9 97C0C 2CC D C%%D Dstackc                     t         rt        j                         }nt        j                  j
                  }t        j                  d|d      }|j                  |       |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   sW      ))+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 )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 |':':;IL <(( $11$HL-"))+G $*#7#7#@$[%1%@%@B	 <(( %Wl.B.BC	<((r'   rC   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)   )rT   rerunget_match_testsr   create_worker_runtests)r$   rC   r   r   r   kwargsrj   s          r%   r   z#WorkerThread.create_worker_runtests   s    ==--77	BKK!#>I$JddD\$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   mkdtemprt   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: )rD   rE   )seekreadstrip	ExceptionrB   rC   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   rD   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: 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  sR   	6'!!!$*//1$$(;(;;)/):):4)@&;^^V^4 1"),,.K1 dnnlF$)$4$46 6	6))+6F -1 1 	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)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3K&*&;&;E&B#I|"99)YOO "&!3!3O4?4F4F4H"JGY %%k2F!$..*.(-7 7 !|&w/!(	D63G!$..Jwi2H&(-(;(;= = "^^I|VLNFF-	M0 !!* ,9~&c$))F94E*F)GIC cMF""$!&&11?	M 	M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)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  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   )r[   r   WAIT_COMPLETED_TIMEOUTr   r   rz   r   r   )r$   rk   r|   s      r%   r   zWorkerThread._wait_completed  si    	&JJ-.))73 	&/v 6&&56L&M%Nc G% & &	&s   $ A(!A##A(rZ   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 )rh   rb   rd   re   rY   r   WAIT_KILLED_TIMEOUTr   )r$   rZ   rl   s      r%   wait_stoppedzWorkerThread.wait_stopped  sz     IIcN==?!J.BHH|D6ob6I5JKL''vT/":M9NO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   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'   rN   workersrR   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   )	rC   rd   re   rZ   r   r   rc   r   rh   )r   r_   workerrC   rl   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)rQ   num_workersrT   loggerresultsrR   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   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 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	   rj   r   process	processeszRun z in parallel using z worker z (timeout: z, worker timeout: r   )ranger   rN   r   rT   r   r   r   r   rX   r   rW   rY   start)r$   indexr   r   nworkersr  r   r   s           r%   start_workerszRunWorkers.start_workers  s    %*1d.>.>.B%CE! %UD1 E}}%%'$'EEt||$8Y<	eW/8I;0<<&t||4&t':':;= >C 	ll 	FLLN	!Es   D c                     t        j                         }| j                  D ]  }|j                           | j                  D ]  }|j	                  |        y r   )rd   re   r   r1   r   )r$   rZ   r   s      r%   stop_workerszRunWorkers.stop_workers  sK    ^^%
ll 	FKKM	ll 	,F
+	,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   )rb   ).0r   s     r%   	<genexpr>z)RunWorkers._get_result.<locals>.<genexpr>  s     ?&//#?s   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  s    mm LL4 ?$,,??112F7;={{??	;;??1?-- ;;  %dll3HHW% ?$,,??( {{ 		s$   B  C= B21B2=DDrH   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 -- )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    !!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 )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;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)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  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  r9   r  r   r"  r   r)   r'   r%   rQ   rQ     st    ;C ;8 ;;*5;:>;6(,[4/ :5(: 5t 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>r1     sX          
     ' '  .  %   F F %D D D =
 ++ ++
   . ..    # #, T$/  0 
GEN$667%v@U:VV	 	) N9## Nb
=l+ =d
 =[  [ r'   