
    z%iU              	          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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 d dl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jP                  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      xr	  e-ed      Z. e j^                  d       G d d             Z0 G d dejb                        Z2de3e4ef   de0e3e4ef   z  fdZ5de4de6ee4f   fdZ7	 d3de0dede4dz  dejp                  fdZ9de4defdZ: G d  d!      Z; G d" d#e      Z<e4Z=e6ed$   e<f   e6ed   e=f   z  Z> G d% d&e?      Z@ G d' d(e
j                        ZBd)eCeB   deCeB   fd*ZD G d+ d,      ZEd-ed.e"ddfd/ZF G d0 d1ejb                        ZGde3e4ef   dee3e4ef   z  fd2ZHy)4    N)
NamedTupleNoReturnLiteralAnyTextIO)support)	os_helper)	TestStats)	Namespace)Regrtest)runtest
TestResultStatePROGRESS_MIN_TIME
MatchTestsRunTests)setup_tests)format_durationprint_warningwin32g      >@g     r@setsidkillpgT)slotsc                   D    e Zd ZU eed<   eed<   dZeed<   dZe	dz  ed<   y)	WorkerJob	test_name	namespaceFrerunNmatch_tests)
__name__
__module____qualname__str__annotations__r   r   boolr   r        O/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/libregrtest/runtest_mp.pyr   r   /   s&    NE4%)Kd")r'   r   c                   2     e Zd Zdedeeef   f fdZ xZS )_EncodeWorkerJoboreturnc                     |xt         d x\    t        j                  |      }d|d<   |S  t        d x\   t	        |      }d|d<   |S  	 t
        |   |      S )Nr&   T__worker_job____namespace__)r   dataclassesasdictr   varssuperdefaultselfr+   result	__class__s      r(   r4   z_EncodeWorkerJob.default8   sj    $++A.+/'(  a*.'  wq))r'   )r    r!   r"   r   dictr#   r4   __classcell__r8   s   @r(   r*   r*   7   s#    * *c3h * *r'   r*   dr,   c                     d| v r| j                  d       t        di | S d| v r| j                  d       t        di | S | S )Nr.   r/   r&   )popr   r   r<   s    r(   _decode_worker_jobr@   F   sH    1	~1~!	o~1~r'   worker_jsonc                 8    t        j                  | t              S )Nobject_hook)jsonloadsr@   )rA   s    r(   _parse_worker_argsrG   Q   s    ::k"46 6r'   
worker_joboutput_filetmp_dirc                    | j                   }|j                  }t        j                  | t              }||}nt
        j                  g}g |t        j                         dddd|}t        t        j                        }|||d<   ||d<   ||d<   t        |||d	t        j                  d
k7  t        j                        }	t        rd	|	d<   t!        j"                  |fi |	S )Nclsz-uz-mztest.regrtestz--worker-argsTMPDIRTEMPTMPTnt)envstdoutstderrtext	close_fdscwdstart_new_session)r   pythonrE   dumpsr*   sys
executabler   args_from_interpreter_flagsr9   osenvironnamer	   SAVEDCWDUSE_PROCESS_GROUP
subprocessPopen)
rH   rI   rJ   nsrY   worker_argsr\   cmdrR   kws
             r(   run_test_in_subprocessri   V   s    
		BYYF**Z-=>K
nn%
)J )<<> ))) ) ) ()C
 rzz
CHFE

 
77d?
B "&C&2&&r'   c                    t        |       }|j                  }|j                  }|j                  }|j                  }t        |       |rC|r)ddj                  |      z   }t        d| d| dd       nt        d| dd       d|_        |||_        t        ||      }t                t        t        j                  |t        	      d       t        j                  d
       y )Nz
matching: , zRe-running z in verbose mode ()Tflushz in verbose moderL   r   )rG   r   r   r   r   r   joinprintverboser   rE   rZ   EncodeTestResultr[   exit)rA   rH   re   r   r   r   matchingr7   s           r(   run_tests_workerru   }   s    #K0J			B$$IE((KO#dii&<<HK	{*<XJaHPTUK	{*:;4H
$R#F	G 
$**V!1
2$?HHQKr'   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)r6   r}   s     r(   __init__zMultiprocessIterator.__init__   s    NN$	$r'   c                     | S ry   r&   r6   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ry   )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ry   )r|   r}   r   s    r(   stopzMultiprocessIterator.stop   s%    YY 	#"DO	# 	# 	#s   'N)r    r!   r"   __doc__r~   r   r   r   r&   r'   r(   rw   rw      s    B%)#r'   rw   c                   @    e Zd ZU eed<   dZedz  ed<   dZedz  ed<   y)MultiprocessResultr7   Nworker_stdouterr_msg)r    r!   r"   r   r$   r   r#   r   r&   r'   r(   r   r      s$     $M3:$GS4Zr'   r   Fc                       e Zd Zy)
ExitThreadN)r    r!   r"   r&   r'   r(   r   r      s    r'   r   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z  de
fdZ	 ddededz  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                 d   t         |           || _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _	        |j                  | _
        d | _        d | _        d | _        d| _        d| _        y )NF)r3   r~   r   runtestspendingoutputre   worker_timeouttimeoutregrtestr   current_test_name
start_time_popen_killed_stopped)r6   r   r   r8   s      r(   r~   zTestWorkerProcess.__init__   s    "~~mm)),,\\
!%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TestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> )r   is_aliveappendr   r   time	monotonicr   extendpidr   ro   )r6   infotestpopendts        r(   __repr__zTestWorkerProcess.__repr__   s    %dnn%567==?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|  }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Kill )filern   zFailed to kill z: )r   r   rb   rp   r[   rT   r^   r   r   signalSIGKILLkillProcessLookupErrorOSErrorr   )r6   r   whatexcs       r(   _killzTestWorkerProcess._kill   s    =<<V>*DVDdVn3::T:	= 		%))V^^4

! 	  	=OD6C7;<<	=s$   4B B 	C$C,CCc                 2    d| _         | j                          y )NT)r   r   r   s    r(   r   zTestWorkerProcess.stop   s    

r'   test_resultrS   c                     t        |||      S ry   )r   )r6   r   rS   r   s       r(   mp_result_errorz!TestWorkerProcess.mp_result_error  s     "+vw??r'   rI   rJ   c                    |j                   | _        	 t        |||      }d| _        || _        	 | j
                  r| j                          t        	 |j                  | j                        }|J || j                          d | _        d | _        S #  d | _         xY w# 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 | _        d | _        y # | j                          d | _        d | _        w xY w)NFr   )r   r   ri   r   r   r   r   r   waitr   _wait_completedrc   TimeoutExpiredr   )r6   rH   rI   rJ   r   retcodes         r(   _run_processzTestWorkerProcess._run_process	  sO   !+!5!5	*:{GLE DLDK
'	*}} 

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

   == %$	 	JJL    "DK%)D"   "DK%)D"sF   B "C8 !B 
B7C4C8 C44C8 7D. 8DD. . Er   c           
      *   t         j                  dk(  rt        j                         }nt         j                  j
                  }| j                  j                  |      }t        j                  d|      5 }t        || j                  | j                  |      }t        j                  stt        j                  d      }t         j"                  j%                  |      }	 | j'                  |||      }t!        j(                  |      }t+        j,                  |       n| j'                  ||      }d}|j/                  d       	 |j1                         j3                         }		 d d d        -t7        |t8        j>                  
      }| j=                  |	      S d }|dk7  rd|z  }nF	jA                  d      \  }	}}|	jC                         }	|sd}n	 tE        jF                  |tH              }|r.t7        |t8        j:                  
      }| j=                  |	|      S rAd| dtK        |       ddjM                  tO        |             }	|z  }	jQ                          tS        	      S # t!        j(                  |      }t+        j,                  |       w xY w# t4        $ rF}
d	|
 }t7        |t8        j:                  
      }| j=                  ||      cY d }
~
cd d d        S d }
~
ww xY w# 1 sw Y   xY w# t4        $ r}
d|
z  }Y d }
~
!d }
~
ww xY w)Nr   zw+)encoding)r   r   r   test_python_)prefixr&   r   zCannot read process stdout: state)r   zExit code %s
zFailed to parse worker stdoutrC   zFailed to parse worker JSON: %sz

Warning -- z leaked temporary files (): rk   )*r[   platformlocalegetencodingrS   r   r   get_match_teststempfileTemporaryFiler   re   r   r   is_wasimkdtempr^   pathabspathr   listdirr	   rmtreeseekreadstrip	Exceptionr   r   MULTIPROCESSING_ERRORr   TIMEOUT
rpartitionrstriprE   rF   decode_test_resultlenro   sortedset_env_changedr   )r6   r   r   r   stdout_filerH   rJ   r   	tmp_filesrS   r   r   r7   _rA   msgs                   r(   _runtestzTestWorkerProcess._runtest>  s   <<7" ))+Hzz**Hmm33I> ##D8< 	E"9-1WW)-/:<J ?? #**.A''//'2."//
KQG "

7 3I$$W-++JD	QE$))+1133	EB ?	?F''77a<$w.G%+%6%6t%<"FA{]]_F9F!ZZ4FHF
 	1L1LMF''@@!!* ,9~&c$))F94E*F)GIC cMF""$!&&11_ !#

7 3I$$W-  E 9>#IU5P5PQ++FG+DD?	E 	E4E5	E 	Ed ! F?#EGFsh   5A)K,I+2AK,JK9 +,JK,	K)#2K$K)K,$K))K,,K69	LLLc                    | j                   j                  }| j                   j                  }| j                  s	 	 t	        | j
                        }t        j                         | _	        | j                  |      }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 Y y t"        $ r2 | j                  j                  dt%        j&                         f       Y y w xY w)NFT)re   failfastfail_env_changedr   r   r   r   r   r   r   r   r7   durationr   put	must_stopr   BaseException	traceback
format_exc)r6   	fail_fastr   r   	mp_results        r(   runzTestWorkerProcess.run  s
   GG$$	7733-- $T\\ 2I #'.."2 MM)4	,0NN,<t,N	  )	 23##--i9IJ K -- %     y';';'= >?s6   C4 BD 4	D =D ?D  D 	E7EE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   JOIN_TIMEOUTrc   r   r   r   r   )r6   r   r   s      r(   r   z!TestWorkerProcess._wait_completed  sg    	&JJ|$))73 	&/v 6&&5l&C%DC G% & &	&s   $ A(!A##A(r   c                    	 | j                  d       | j                         sy t        j                         |z
  }| j                  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 )	ro   r   r   r   r   logr   r   r   )r6   r   r   s      r(   wait_stoppedzTestWorkerProcess.wait_stopped  s     IIcN==?!J.BMMTF 3%%4R%8$9; <L vT/":M9NOP r'   r,   N)NNry   )r    r!   r"   intr~   r#   r   r   r   r   r   r   r   r   r   r   r   floatr   r:   r;   s   @r(   r   r      s    # /G D  '# ' =8 "	@@ d
@
 
@ ,03*F 3*!Dj3*473*jM2# M2*< M2^.&u  r'   r   workersc                     g }| D ]^  }|j                   }|st        j                         |j                  z
  }|t        k\  s=|dt        |      d}|j                  |       ` |S )Nz (rl   )r   r   r   r   r   r   r   )r   r   workerr   r   rU   s         r(   get_runningr     sj    G !"44 ^^ 1 11"" 1?23FGDNN4 ! Nr'   c                   j    e Zd Z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)r   r   r   r,   Nc                    |j                   }|j                  }|| _        || _        |j                  | _        | j                  j
                  | _        || _         t        j                         | _        |j                         }t        |      | _        |t        |dz  |dz         | _        d | _        y d | _        d | _        y )Ng      ?i,  )re   r   r   r   r   r   queueQueuer   
iter_testsrw   r   minr   r   )r6   r   r   re   r   r}   s         r(   r~   zMultiprocessTestRunner.__init__  s    [[**  ^^
==$$05((*
+J7 #&gmWv5E"FD  #'Dr'   c                    | j                   j                  }| j                   j                  }t        d|dz         D cg c]  }t	        ||        c}| _        dt        | j
                         d}|r(|dt        |      dt        | j                        dz  }| j                  |       | j
                  D ]  }|j                           y c c}w )N   zRun tests in parallel using z child processesz (timeout: z, worker timeout: rl   )re   use_mpr   ranger   r   r   r   r   r   start)r6   r	  r   indexr   r   s         r(   start_workersz$MultiprocessTestRunner.start_workers  s    ''//%*1fqj%9;! *%6 ;,S->,??OP&w/&t':':;= >C 	ll 	FLLN	;s   Cc                     t        j                         }| j                  D ]  }|j                           | j                  D ]  }|j	                  |        y ry   )r   r   r   r   r   )r6   r   r   s      r(   stop_workersz#MultiprocessTestRunner.stop_workers  sK    ^^%
ll 	FKKM	ll 	,F
+	,r'   c                 h   | j                   j                  }| j                   j                  d u}t        }t	        d | j
                  D              r:|rt        j                  t        d       	 | j                  j                  |      S 	 | j                  j                  d      S # t        j                  $ r Y nw xY wt        | j
                        }|r%|s#| j                  ddj                  |      z         t	        d | j
                  D              rɌ# t        j                  $ r Y y w xY w)Nc              3   <   K   | ]  }|j                           y wry   )r   ).0r   s     r(   	<genexpr>z5MultiprocessTestRunner._get_result.<locals>.<genexpr>  s     ?&//#?s   T)rs   r   zrunning: %srk   r   )re   pgor   PROGRESS_UPDATEanyr   faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTr   getr  Emptyr   r   ro   )r6   r  use_faulthandlerr   r   s        r(   _get_resultz"MultiprocessTestRunner._get_result  s    ggkk GGOO47! ?$,,??112F7;={{w77	;;??1?-- ;;  "$,,/Gs7);;< ?$,,??& {{ 		s$   /B( D (B>=B>D10D1r   c                    |j                   }| j                  j                  }t        |      }|j                  r|d|j                  z  z  }n0|j
                  t        k\  r|s|dt        |j
                        z  z  }t        | j                        }|r|s|ddj                  |      z  z  }| j                  j                  | j                  |       y )Nz (%s)z -- running: %srk   )r7   re   r  r#   r   r   r   r   r   r   ro   r   display_progress
test_index)r6   r   r7   r  rU   r   s         r(   display_resultz%MultiprocessTestRunner.display_result  s    !!ggkk6{Gi////Doo!223Gofoo>>>Ddll+3%		'(:::D&&t=r'   itemc                    | j                   j                  }|d   rM|d   }t        d|        t        dt        j
                        }| j                  j                  ||       |S | xj                  dz  c_        |d   }|j                  }| j                  j                  ||       | j                  |       |j                  rt        |j                  d       |S )	z&Returns True if test runner must stop.r   r  zregrtest worker thread failed: z<regrtest worker>r   )r   Trm   )r   r   r   r   r   r   r   accumulate_resultr   r7   r!  r   rp   )r6   r"  r   r   r7   r   s         r(   _process_resultz&MultiprocessTestRunner._process_result*  s    ##7aJ;J<HI 35;V;VWFMM++F%+@M1G	!!''e'<I&"")))6r'   c                    | j                   j                  }| j                   j                  }| j                   j                  }| j	                          d| _        	 	 | j                         }|n%| j                  |      }|j                  ||      rn8|t        j                          | j                  j!                          | j#                          y # t        $ r t                d| j                  _        Y gw xY w# |t        j                          | j                  j!                          | j#                          w xY w)Nr   T)re   r   r   r   r  r   r  r%  r   KeyboardInterruptrp   r   interruptedr  cancel_dump_traceback_laterr   r   r  )r6   r   r   r   r"  r7   s         r(   	run_testsz MultiprocessTestRunner.run_tests@  s   GG$$	7733''//	 '')<--d3##I/?@  "88: LL ! 	-G(,DMM%	- "88: LLs%   9C $C<9C? ;C<<C? ?AEr   )r    r!   r"   r   r   r~   r  r  QueueOutputr  r   r!  r%   r%  r*  r&   r'   r(   r   r     sc     X $ *,[4/ :>(: >t >K D , r'   r   r   r   c                 8    t        | |      j                          y ry   )r   r*  )r   r   s     r(   run_tests_multiprocessr-  ^  s    8X.88:r'   c                   6     e Zd ZdZdedeeef   f fdZ xZS )rr   z7Encode a TestResult (sub)class object into a JSON dict.r+   r,   c                     t        |t              r0t        j                  |      }|j                  j
                  |d<   |S t        |   |      S )N__test_result__)
isinstancer   r0   r1   r8   r    r3   r4   r5   s      r(   r4   zEncodeTestResult.defaulte  sF    a$ ''*F()(<(<F$%Mwq!!r'   )	r    r!   r"   r   r   r9   r#   r4   r:   r;   s   @r(   rr   rr   b  s&    A" "c3h " "r'   rr   c                 r    d| vr| S | j                  d       | d   t        di | d   | d<   t        di | S )z7Decode a TestResult (sub)class object from a JSON dict.r0  statsr&   )r>   r
   r   r?   s    r(   r   r   n  sI     !EE
z,7,'
??r'   ry   )Ir0   r  rE   os.pathr^   r  r   rc   r[   r   rz   r   r   typingr   r   r   r   r   r   r   test.supportr	   r
   test.libregrtest.cmdliner   test.libregrtest.mainr   test.libregrtest.runtestr   r   r   r   r   r   test.libregrtest.setupr   test.libregrtest.utilsr   r   r   r   r  r  r   hasattrrb   	dataclassr   JSONEncoderr*   r9   r#   r@   tuplerG   rd   ri   ru   rw   r   ExcStrr+  r   r   Threadr   listr   r   r-  rr   r   r&   r'   r(   <module>rC     sM          
     = =  " " . *  / A<<7 ++ +
   . . R*Dwr8/D  T"* * #**t'' *$sCx. Yc3h-G 6C 6E)S.,A 6 26$'y $'(.$'$'$J$':D:J:J$'N# ( :# #,  
GEN$667%v@U:VV	 	D	(( DN
/0 
T:K5L 
H  H V;X ; ;d ;	"t'' 	"	$sCx. 	Z$sCx.-H 	r'   