Ë
    òT•j\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     ú3/usr/lib/python3.12/test/libregrtest/run_workers.pyÚ__init__zMultiprocessIterator.__init__8   s   € Ü—N‘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 Y   y xY wr   )r"   r#   ÚStopIterationÚnextr*   s    r%   Ú__next__zMultiprocessIterator.__next__?   s:   € Ø�Y‰Yñ 	)Ø�‰Ð&Ü#Ð#Ü˜Ÿ™Ó(÷	)÷ 	)ò 	)ú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%   € Ø�Y‰Yñ 	#Ø"ˆDŒO÷	#÷ 	#ñ 	#ú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$   … àÓà $€M�3˜‘:Ó$Ø€GˆS�4‰ZÔ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,   ø€ ô
 ˜I¨UÔ3ˆÜ+¨F°F¸GÓ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   ø€ Ü‰ÑÔØ"ˆŒØŸ™ˆŒØ—~‘~ˆŒØ—m‘mˆŒØ×,Ñ,ˆŒØ—:‘:ˆŒØ*.ˆŒØ(,ˆŒØ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ˆØ�=‰=Œ?Ø�K‰K˜	Õ"à�K‰K˜	Ô"Ø�~‰~ˆÙØ�K‰K˜% ˜v˜Ô'Ø—‘ˆØÐÜ—‘Ó! D§O¡OÑ3ˆBØ�K‰K˜4 §¡§¡Ð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à�V˜8Ð$ˆDä��d�Vˆn¤3§:¡:°TÕ:ð	=Ý Ü—	‘	˜%Ÿ)™)¤V§^¡^Õ4à—
‘
•øÜ!ò 	ñ Üò 	=Ü˜O¨D¨6°°C°7Ð;×<Ñ<ûð	=ú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 × Ñ Ô"ØˆD�Køô3 ×,Ñ,ò 
Ø—=’=ô %Ð$ð —
‘
”ð ’ô ò Ø—=’=ô %Ð$Øðúð	 øð	Ø�J‰JŒLØúð ð × Ñ Ô"ØˆD�Køð × Ñ Ô"ØˆD�Kús;   �"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ä—z‘z×*Ñ*ˆHô ×,Ñ,¨TØ6>Ø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°$ÀÔHˆLØ×Ñ Ô-à"×)Ñ)Ó+ˆGÝô $*×#7Ñ#7¸Ó#@�Ü$ [Ü%1×%@Ñ%@óB�	ð ˜<Ð(Ð(ô % W¬l×.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¸	ÓB‰KàˆKà!#ˆÙØ>IÖ$J°d d¨D¢\Ò$JˆF�=Ñ!Ø�=‰=×*Ò*Ø $ˆF�9ÑØ*/ˆFÐ&Ñ'Ø3ˆt�}‰}×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Ü—g‘g—o‘o gÓ.ˆGð*Ø×+Ñ+¨OØ,5°wó@�ô ŸJ™J wÓ/�	Ü× Ñ  Ô)ð
 ˜Ð#Ð#ð ×'Ñ'¨¸ÓCˆGØˆIà˜Ð#Ð#øô ŸJ™J wÓ/�	Ü× Ñ  Õ)ú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ô ˜dŸn™nØ <¸S¸EÐBØ%)Ü$)×$4Ñ$4ô6ð 6ûð	6ús   “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ñ Ü˜dŸn™n¨l¸FÜ$)×$4Ñ$4ô6ð 6ð	6Ü×)Ñ)¨+Ó6ˆFð ˜ÐÐ÷-1ð 1ûäò 	6ð =¸S¸EÐBˆGÜ˜dŸn™n¨g°vÜ$)×$4Ñ$4ô6ð 6ûð		6ûô ò 	6ð >¸c¸UÐCˆGÜ˜dŸn™n¨g°vÜ$)×$4Ñ$4ô6ð 6ûð		6úsH   ‚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Ó3ˆKØ&*×&;Ñ&;¸EÓ&BÑ#ˆI�|Ø"×9Ñ9¸)ÀYÓOˆOð "&×!3Ñ!3°OØ4?×4FÑ4FÓ4Hó"JÑˆG�Yð ×%Ñ% kÓ2ˆFàˆÜ! $§.¡.¸Ø*.Ü(-¯©ô7ð 7ð ˜!Š|Ü& wÓ/�ÙØ!( 	¨¨D¨6°Ð3�GÜ! $§.¡.°J¸w¸iÐ2HÈ&Ü(-×(;Ñ(;ô=ð =ð "Ÿ^™^¨I°|ÀVÓL‰NˆF�F÷-	Mñ0 ð!Ø!* ð ,Ü˜9“~Ð& c¨$¯)©)´F¸9Ó4EÓ*FÐ)GðIˆCð �c‰MˆFØ×"Ñ"Ô$ä! &¨&Ó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  € Ø—M‘M×+Ñ+ˆ	ØŸ=™=×9Ñ9ÐØ—-’-ððÜ $ T§\¡\Ó 2�Iô #'§.¡.Ó"2�”Ø!*�”ð*Ø $§¡¨iÓ 8�Ið &*�D”NÜ,0¯N©NÓ,<¸t¿¹Ñ,N�	× Ñ Ô)Ø—‘—‘ ¨	Ð 2Ô3à×#Ñ#×-Ñ-¨iÐ9IÔJØð Kð% —-•-øô %ò Ùðûô #ò .Ø #§¡•Iûð.ûð &*�D•Nûô ò ÙÜ ò Ø—‘—‘ ¤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   € Ø—‘ˆð	&Ø�J‰JÔ-Õ.øÜ×)Ñ)¬7Ð3ò 	&ÜÐ/°¨vð 6&Ü&5Ô6LÓ&MÐ%NÈcØ ˜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   € ð à�I‰I�cŒNØ—=‘=”?ØÜ—‘Ó! JÑ.ˆBØ�H‰H�| D 6¨´oÀbÓ6IÐ5JÐKÔLØÔ'Ò'Ü °¨v°T¼/È"Ó:MÐ9NÐ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×&:Ñ&:ð )¸uÀXÈvÐX\É}ÐE\Ñ?]ó )ð,°ð ÀXð ÐR`ó ð$$¨^ð $Ø!$ð$Ø).¨s°T©z¸4À¹=Ð/HÑ)Ió$ð.
6 vð 
6°#ó 
6ð   8ð   ¸6ÀD¹=ð   Øð  Ø"'¨
°C¨Ñ"8ó  ðD 2 (ð  2Ð/Aó  2óDó:&ð 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Ð"7°qÐ9ˆDØ�N‰N˜4Õ ð!ñ ØØ”s˜7“|�n C¨¯	©	°'Ó(:Ð';Ð<Ð<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ˆŒØ×'Ñ'ˆŒØ�<‰<Ð#ô 14°D·L±LÀ3Ñ4FÈÏÉÐW]ÑH]Ó0^ˆDÕà"&ˆDÔØ26ˆŒà�}‰}×%Ñ%Ó'ˆØÐô  # 4×#3Ñ#3°TÓ:ˆ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÷   € ä%*¨1¨d×.>Ñ.>ÀÑ.BÓ%CöEØ!ô % U¨DÕ1ò EˆŒà�}‰}×%Ñ%Ó'ˆØÐÜ˜$ Ó'‰EàˆEÜ�t—|‘|Ó$ˆÜ˜8 Y°Ó<ˆ	Ø�e�WÐ/Ø�˜8 I ;ð0ˆà�<Š<ÙÜ& t§|¡|Õ4Ü& t×':Ñ':Õ;ð=ñ >ˆCð 	�‰�ŒØ—l‘lò 	ˆFØ�L‰L�Nñ	ùò!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   € Ü—^‘^Ó%ˆ
Ø—l‘lò 	ˆFØ�K‰K�Mð	à—l‘lò 	,ˆ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å   € Ø�m‰m×ÑˆØ ŸL™L°Ð4Ðô Ñ?°$·,±,Ô?Ô?ÙÜ×1Ñ1Ô2FØ7;õ=ðØ—{‘{—‘¬�Ó?Ð?ð	Ø—;‘;—?‘?¨1�?Ó-Ð-øô —;‘;ò Ùðúñ ä% d§l¡lÓ3�ÙØ—H‘H˜WÔ%ô Ñ?°$·,±,Ô?Õ?ùô( �{‰{ò 	Ùð	ú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£   € Ø×!Ñ!ˆØ�m‰m×Ñˆä�6‹{ˆØ×Òà�G˜i×/Ñ/Ñ/Ñ/‰DØ�o‰oÔ!2Ò2¹3Ø�Gœo¨f¯o©oÓ>Ñ>Ñ>ˆDÙÜ! $§,¡,Ó/ˆGÙØ˜$˜w˜iÐ(Ñ(�Ø×Ñ˜dŸo™o¨tÕ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ÜÐ 3¼5×;KÑ;KÔLˆFØ�L‰L×*Ñ*¨6°4·=±=ÔAØˆMà�Š˜1Ñ�Ø˜‘Gˆ	Ø×!Ñ!ˆØ�‰×&Ñ& v¨t¯}©}Ô=Ø×Ñ˜IÔ&ð �}‰}×.Ò.Ø‰Kð "Ÿ<™<¬5¯<©<Ñ7ˆKÙØ×,Ñ,ˆFÙÜ�f DÕ)àˆ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
  € Ø—M‘M×+Ñ+ˆ	ØŸ=™=×9Ñ9Ðà×ÑÔàˆŒð	 ØØ×'Ñ'Ó)�Ø�<Øà×-Ñ-¨dÓ3�Ø×#Ñ# IÐ/?Ô@Øð ð �|‰|Ð'Ü×8Ñ8Ô:ð �L‰L×ÑÔØ×ÑÕøô !ò 	,ÜŒGØ'+ˆD�L‰LÖ$ð	,ûð �|‰|Ð'Ü×8Ñ8Ô:ð �L‰L×ÑÔØ×ÑÕú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Ð(:ð 5¸tó 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ðð 
€Ø�G˜E‘NÐ$6Ð6Ñ7¸%ÀÈÁÈvÐ@UÑ:VÑV€ô	�ô 	ô�)ô ôN�9×#Ñ#ô Nðb
=˜˜lÑ+ð =°°d±
ó =÷[ ò [ r'   