ó
    F\h6Y  ã                   óŠ  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKJrJrJr  S SKJr  S SKJrJr  SSKJr  SSKJrJr  SSKJr  SS	KJrJrJ r J!r!  SS
K"J#r#  SSK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+  SSK,J-r-J.r.  \(       a  S SK/r/S SK0r0Sr1\1\#:¼  d   eSr2\2\1:¼  d   eSr3Sr4 " S S5      r5\Rl                  " SSS9 " S S5      5       r7 " S S5      r8\9r:\;\S   \74   \;\S   \:4   -  r<\<\8-  r= " S S\>5      r? " S S\>5      r@SrA " S S\
R„                  5      rCS \D\C   S!\9S-  4S" jrE " S# S$5      rFg)%é    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                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚMultiprocessIteratoré4   z8A thread-safe iterator over tests for multiprocess mode.c                 óD   • [         R                  " 5       U l        Xl        g ©N)Ú	threadingÚLockÚlockÚ
tests_iter)Úselfr$   s     Ú3/usr/lib/python3.13/test/libregrtest/run_workers.pyÚ__init__ÚMultiprocessIterator.__init__8   s   € Ü—N’NÓ$ˆŒ	Ø$�ó    c                 ó   • U $ r    © ©r%   s    r&   Ú__iter__ÚMultiprocessIterator.__iter__<   s   € Øˆr)   c                 ó    • U R                      U R                  c  [        e[        U R                  5      sS S S 5        $ ! , (       d  f       g = fr    )r#   r$   ÚStopIterationÚnextr,   s    r&   Ú__next__ÚMultiprocessIterator.__next__?   s/   € Ø�Y‹YØ�‰Ñ&Ü#Ð#Ü˜Ÿ™Ó(÷ �Y�Yús	   �(?¿
Ac                 ó^   • U R                      S U l        S S S 5        g ! , (       d  f       g = fr    ©r#   r$   r,   s    r&   ÚstopÚMultiprocessIterator.stopE   s   € Ø�Y‹YØ"ˆDŒO÷ �YŽYús   �ž
,r5   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r'   r-   r2   r6   Ú__static_attributes__r+   r)   r&   r   r   4   s   † áBò%òò)õ#r)   r   T)ÚslotsÚfrozenc                   óH   • \ rS rSr% \\S'   Sr\S-  \S'   Sr\S-  \S'   Sr	g)ÚMultiprocessResultéJ   ÚresultNÚworker_stdoutÚerr_msgr+   )
r8   r9   r:   r;   r   Ú__annotations__rD   ÚstrrE   r=   r+   r)   r&   rA   rA   J   s$   ‡ àÓà $€M�3˜‘:Ó$Ø€GˆS�4‰ZÖr)   rA   c                   ó   • \ rS rSrSrSrg)ÚWorkerThreadExitedéR   z)Indicates that a worker thread has exitedr+   N)r8   r9   r:   r;   r<   r=   r+   r)   r&   rI   rI   R   s   † Ü3r)   rI   Fc                   ó   • \ rS rSrSrg)Ú
ExitThreadéZ   r+   N)r8   r9   r:   r;   r=   r+   r)   r&   rL   rL   Z   s   † Úr)   rL   c                   óH   ^ • \ rS rSrS\S\S-  S\S-  S\4U 4S jjrSrU =r$ )	ÚWorkerErroré^   Ú	test_namerE   NÚstdoutÚstatec                 óV   >• [        XS9n[        XSU5      U l        [        TU ]  5         g )N©rS   )r   rA   Ú	mp_resultÚsuperr'   )r%   rQ   rE   rR   rS   rC   Ú	__class__s         €r&   r'   ÚWorkerError.__init___   s(   ø€ ô
 ˜IÑ3ˆÜ+¨F¸GÓDˆŒÜ‰ÑÕr)   )rV   )	r8   r9   r:   r;   r   rG   r'   r=   Ú__classcell__©rX   s   @r&   rO   rO   ^   s9   ø† ðØ$ðà ™*ðð ˜t™ðð ÷	õ r)   rO   z<not running>c            
       ó˜  ^ • \ rS rSrS\SSSS4U 4S jjrS\4S jrS#S	 jrS#S
 jr	 S$S\
S\S\S-  S\S-  4S jjrS\R                  S\4S jrS\R                  S\\\S-  4   4S jrS\S\S\
4S jrS\
S\S\\S-  \\   4   4S jrS\S\4S jrS\S\S-  S\S\\\4   4S jrS\S\4S jrS#S jrS#S jrS \SS4S! jr S"r!U =r"$ )%ÚWorkerThreadél   Ú	worker_idÚrunnerÚ
RunWorkersÚreturnNc                 óL  >• [         TU ]  5         Xl        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        [        U l
        [        R                  " 5       U l        S U l        SU l        SU l        g )NF)rW   r'   r_   ÚruntestsÚpendingÚoutputÚworker_timeoutÚtimeoutÚlogÚ_NOT_RUNNINGrQ   ÚtimeÚ	monotonicÚ
start_timeÚ_popenÚ_killedÚ_stopped)r%   r_   r`   rX   s      €r&   r'   ÚWorkerThread.__init__m   sv   ø€ Ü‰ÑÔØ"ŒØŸ™ˆŒØ—~‘~ˆŒØ—m‘mˆŒØ×,Ñ,ˆŒØ—:‘:ˆŒÜ%ˆŒÜŸ.š.Ó*ˆŒØ48ˆŒØˆŒØˆ�r)   c                 óÂ  • SU R                    3/nU R                  5       (       a  UR                  S5        OUR                  S5        U R                  nU(       a  UR                  SU 35        U R                  nUbN  [
        R                  " 5       U R                  -
  nUR                  SUR                   3S[        U5       345        SSR                  U5      -  $ )	NzWorkerThread #ÚrunningÚstoppedztest=zpid=ztime=z<%s>Ú )r_   Úis_aliveÚappendrQ   rn   rk   rl   rm   ÚextendÚpidr   Újoin)r%   ÚinfoÚtestÚpopenÚdts        r&   Ú__repr__ÚWorkerThread.__repr__{   s¼   € Ø  §¡Ð 0Ð1Ð2ˆØ�=‰=�?‰?Ø�K‰K˜	Õ"à�K‰K˜	Ô"Ø�~‰~ˆÞØ�K‰K˜% ˜v˜Ô'Ø—‘ˆØÑÜ—’Ó! D§O¡OÑ3ˆBØ�K‰K˜4 §	¡	˜{Ð+Ø ¤°Ó!4Ð 5Ð6ð8ô 9à˜Ÿ™ ›Ñ&Ð&r)   c                 óº  • U R                   nUc  g U R                  (       a  g SU l        [        (       a  U  S3nOU  S3n[        SU 3[        R
                  SS9   [        (       a0  [        R                  " UR                  [        R                  5        g UR                  5         g ! [         a     g [         a  n[        SU SU< 35         S nAg S nAff = f)NTz process groupz processzKill )ÚfileÚflushzFailed to kill z: )rn   ro   r   ÚprintÚsysÚstderrÚosÚkillpgry   ÚsignalÚSIGKILLÚkillÚProcessLookupErrorÚOSErrorr   )r%   r}   ÚwhatÚexcs       r&   Ú_killÚWorkerThread._kill‹   s·   € Ø—‘ˆØ‰=Øà�<�<ØØˆŒçÒØ�V˜>Ð*‰Dà�V˜8Ð$ˆDä��d�Vˆn¤3§:¡:°TÒ:ð	=ß Ò Ü—	’	˜%Ÿ)™)¤V§^¡^Õ4à—
‘
•øÜ!ó 	ñ Üó 	=Ü˜O¨D¨6°°C±7Ð;×<Ñ<ûð	=ús$   Á:B) ÂB) Â)
CÂ5	CÂ>CÃCc                 ó2   • SU l         U R                  5         g )NT)rp   r�   r,   s    r&   r6   ÚWorkerThread.stop§   s   € àˆŒØ�
‰
�r)   rd   Ú	output_fdÚtmp_dirc                 óR  • [        XU5      nX@l        SU l         U R                  (       a  U R	                  5         [
        e UR                  U R                  S9nUc   eUU R                  5         S U l        $ ! [        R                   a,    U R                  (       a  [
        eU R	                  5         S n O%[         a    U R                  (       a  [
        ee f = f U R                  5         S U l        g !   U R	                  5         e = f! U R                  5         S U l        f = f)NF©rh   )r   rn   ro   rp   r�   rL   Úwaitrh   Ú_wait_completedÚ
subprocessÚTimeoutExpiredr�   )r%   rd   r”   r•   r}   Úretcodes         r&   Ú_run_processÚWorkerThread._run_process¬   s	  € ä% h¸7ÓCˆØŒØˆŒð'	Ø�}�}ð —
‘
”Ü Ð ðàŸ*™*¨T¯\©\˜*Ð:�ØÑ*Ð*Ð*Øð4 × Ñ Ô"ØˆD�Køô5 ×,Ñ,ó 
Ø—=—=ô %Ð$ð —
‘
”ð ’ô ó Ø—=—=ô %Ð$Øðúð ð
 × Ñ Ô"ØˆD�Køð	Ø�J‰JŒLØûà× Ñ Ô"ØˆD�Kús5   ›'C7 ÁA: Á:=CÂ7C7 Â9"CÃC7 Ã7D
Ä
D ÄD&Ústackc                 óÊ   • [         (       a  [        R                  " 5       nO[        R                  R
                  n[        R                  " SUSS9nUR                  U5        U$ )z/Create stdout temporary file (file descriptor).úw+Úbackslashreplace)ÚencodingÚerrors)	r   ÚlocaleÚgetencodingr…   rR   r£   ÚtempfileÚTemporaryFileÚenter_context)r%   rŸ   r£   Ústdout_files       r&   Úcreate_stdoutÚWorkerThread.create_stdoutÛ   sY   € ÷ Š:ô ×)Ò)Ó+‰Hä—z‘z×*Ñ*ˆHô ×,Ò,¨TØ6>Ø4FñHˆð 	×Ñ˜KÔ(ØÐr)   c                 ó¤  • U R                   R                  5       nU(       a  [        S[        R                  5      nSnX44$ [
        R                  " SSS9nUR                  U5        UR                  5       n[        (       a3  [        R                  " U5      n[        U[        R                  5      nX44$ [        U[        R                  5      nX44$ )zCreate JSON file.Nr¡   Úutf8©r£   )rd   Ú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_fileÚWorkerThread.create_json_fileñ   sÁ   € ð  $Ÿ}™}×AÑAÓCÐÞÜ  ¤|×':Ñ':Ó;ˆIØˆLð Ð(Ð(ô $×1Ò1°$ÀÑHˆLØ×Ñ Ô-à"×)Ñ)Ó+ˆGßŠzô $*×#7Ò#7¸Ó#@�Ü$ [Ü%1×%@Ñ%@óB�	ð Ð(Ð(ô % W¬l×.BÑ.BÓC�	ØÐ(Ð(r)   rQ   r·   c                 óL  • U4nU R                   R                  (       a  U R                   R                  U5      nOS n0 nU(       a  U Vs/ s H  ofS4PM     snUS'   U R                   R                  (       a
  SUS'   SUS'   U R                   R                  " SUUS.UD6$ s  snf )NTÚmatch_testsÚverboseFÚoutput_on_failure)Útestsr·   r+   )rd   ÚrerunÚget_match_testsrÀ   Úcreate_worker_runtests)r%   rQ   r·   rÁ   r¾   Úkwargsr|   s          r&   rÄ   Ú#WorkerThread.create_worker_runtests  s¦   € Ø�ˆØ�=‰=××ØŸ-™-×7Ñ7¸	ÓB‰KàˆKà!#ˆÞÙ>IÓ$Jºk°d¨D£\¹kÑ$JˆF�=Ñ!Ø�=‰=×*×*Ø $ˆF�9ÑØ*/ˆFÐ&Ñ'Ø�}‰}×3Ò3ð ØØñð ñð 	ùò	 %Ks   Á
B!Úworker_runtestsÚ	stdout_fdc                 ó¤  • [         R                  (       du  [        R                  " SS9n[        R
                  R                  U5      n U R                  UX#5      n[        R                  " U5      n[        R                  " U5        XE4$ U R                  X5      n/ nXE4$ ! [        R                  " U5      n[        R                  " U5        f = f)NÚtest_python_)Úprefix)r   Úis_wasir§   Úmkdtempr‡   ÚpathÚabspathr�   Úlistdirr   Úrmtree)r%   rÇ   rÈ   r•   rœ   Ú	tmp_filess         r&   Úrun_tmp_filesÚWorkerThread.run_tmp_files  s³   € ô
 ��ô ×&Ò&¨nÑ=ˆGÜ—g‘g—o‘o gÓ.ˆGð*Ø×+Ñ+¨OØ,5ó@�ô ŸJšJ wÓ/�	Ü× Ò  Ô)ð
 Ð#Ð#ð ×'Ñ'¨ÓCˆGØˆIàÐ#Ð#øô ŸJšJ wÓ/�	Ü× Ò  Õ)ús   Á
B! Â!.Crª   c                 óÔ   • UR                  S5         UR                  5       R                  5       $ ! [         a,  n[	        U R
                  SU 3S [        R                  S9eS nAff = f)Nr   zCannot read process stdout: )rR   rS   )ÚseekÚreadÚstripÚ	ExceptionrO   rQ   r   Ú
WORKER_BUG)r%   rª   r�   s      r&   Úread_stdoutÚWorkerThread.read_stdout0  sh   € Ø×Ñ˜Ôð	6Ø×#Ñ#Ó%×+Ñ+Ó-Ð-øÜó 	6ô ˜dŸn™nØ <¸S¸EÐBØ%)Ü$)×$4Ñ$4ñ6ð 6ûð	6ús   “1 ±
A'»'A"Á"A'r¸   rR   c                 ó¸  •  Ub"  UR                  S5        UR                  5       nOkUR                  [        R                  :X  a%  UR                  S5      u  p5nUR                  5       nO(UR                  SS9 nUR                  5       nS S S 5        W(       d$  [        U R                  SU[        R                  S9e [        R                  " U5      n	X“4$ ! , (       d  f       NS= f! [         a-  nSU 3n[        U R                  Xƒ[        R                  S9eS nAff = f! [         a-  nSU 3n[        U R                  Xƒ[        R                  S9eS nAff = f)	Nr   Ú
r®   r¯   z$Failed to read worker process JSON: rU   z
empty JSONz%Failed to parse worker process JSON: )rÖ   r×   Ú	file_typer   r±   Ú
rpartitionÚrstripÚopenrÙ   rO   rQ   r   rÚ   r   Ú	from_json)
r%   r·   r¸   rR   Úworker_jsonÚ_Újson_fpr�   rE   rC   s
             r&   Ú	read_jsonÚWorkerThread.read_json<  sC  € ð	6ØÑ'Ø×!Ñ! !Ô$Ø*×/Ñ/Ó1‘Ø×$Ñ$¬×(;Ñ(;Ó;Ø)/×):Ñ):¸4Ó)@Ñ&�˜;ØŸ™›‘à—^‘^¨V�^Ñ4¸Ø")§,¡,£.�K÷ 5ö Ü˜dŸn™n¨l¸FÜ$)×$4Ñ$4ñ6ð 6ð	6Ü×)Ò)¨+Ó6ˆFð ÐÐ÷- 5Õ4ûäó 	6ð =¸S¸EÐBˆGÜ˜dŸn™n¨gÜ$)×$4Ñ$4ñ6ð 6ûð		6ûô ó 	6ð >¸c¸UÐCˆGÜ˜dŸn™n¨gÜ$)×$4Ñ$4ñ6ð 6ûð		6úsY   ‚$C( §AC( Á*C( Á9CÂ
C( Â>D" Ã
C%Ã!C( Ã%C( Ã(
DÃ2(DÄDÄ"
EÄ,(EÅEc           
      óÜ  • [         R                  " 5        nU R                  U5      nU R                  U5      u  pEU R	                  X5      nU R                  UUR                  5       5      u  pxU R                  U5      n	Uc$  [        U R                  U	S [        R                  S9eUS:w  aA  [        U5      n
U
(       a  U SU
 S3n[        U R                  SU 3U	[        R                  S9eU R                  XEU	5      u  p¹S S S 5        W(       aA  SU S[        U5       S	S
R!                  [#        U5      5       3nW	U-  n	WR%                  5         ['        WW	5      $ ! , (       d  f       Nb= f)N)rR   rE   rS   r   ú (Ú)z
Exit code rU   z

Warning -- z leaked temporary files (ú): ú, )Ú
contextlibÚ	ExitStackr«   r»   rÄ   rÓ   r²   rÛ   rO   rQ   r   ÚTIMEOUTr   ÚWORKER_FAILEDrç   Úlenrz   ÚsortedÚset_env_changedrA   )r%   rQ   rŸ   rª   r·   r¸   rÇ   rœ   rÒ   rR   ÚnamerC   Úmsgs                r&   Ú_runtestÚWorkerThread._runtest^  sm  € Ü×!Ò!Ô# uØ×,Ñ,¨UÓ3ˆKØ&*×&;Ñ&;¸EÓ&BÑ#ˆIØ"×9Ñ9¸)ÓOˆOð "&×!3Ñ!3°OØ4?×4FÑ4FÓ4Hó"JÑˆGð ×%Ñ% kÓ2ˆFà‰Ü! $§.¡.¸Ø*.Ü(-¯©ñ7ð 7ð ˜!‹|Ü& wÓ/�ÞØ!( 	¨¨D¨6°Ð3�GÜ! $§.¡.°J¸w¸iÐ2HÈ&Ü(-×(;Ñ(;ñ=ð =ð "Ÿ^™^¨IÀVÓL‰NˆF÷- $ö0 ð!Ø!* ð ,Ü˜9“~Ð& c¨$¯)©)´F¸9Ó4EÓ*FÐ)GðIˆCð �c‰MˆFØ×"Ñ"Ô$ä! &¨&Ó1Ð1÷? $Õ#ús   –C+EÅ
E+c                 óÞ  • U R                   R                  nU R                   R                  n U R                  (       dÕ   [	        U R
                  5      n[        R                  " 5       U l	        X0l
         U R                  U5      n[        U l
        [        R                  " 5       U R                  -
  UR                  l        U R"                  R%                  SU45        UR                  R'                  X5      (       a  OU R                  (       d  MÕ  U R"                  R%                  [1        5       5        g ! [         a     M1  f = f! [         a  nUR                  n S nANÝS nAff = f! [        U l
        f = f! [(         a     Nt[*         a3    U R"                  R%                  S[,        R.                  " 5       45         N¯f = f! U R"                  R%                  [1        5       5        f = f)NFT)rd   Ú	fail_fastÚfail_env_changedrp   r1   re   r0   rk   rl   rm   rQ   r÷   rO   rV   rj   rC   Údurationrf   ÚputÚ	must_stoprL   ÚBaseExceptionÚ	tracebackÚ
format_excrI   )r%   rú   rû   rQ   rV   r�   s         r&   ÚrunÚWorkerThread.run€  sg  € Ø—M‘M×+Ñ+ˆ	ØŸ=™=×9Ñ9Ðð	2Ø—m—mðÜ $ T§\¡\Ó 2�Iô #'§.¢.Ó"2�”Ø!*”ð2Ø $§¡¨iÓ 8�Iô &2�D”NÜ,0¯NªNÓ,<¸t¿¹Ñ,N�	× Ñ Ô)Ø—‘—‘ ¨	Ð 2Ô3à×#Ñ#×-Ñ-¨i×JÑJØð% —m—m‘mð0 �K‰K�O‰OÔ.Ó0Õ1øô+ %ó Úðûô #ó .Ø #§¡•Iûð.ûô &2�D•Nûô ó 	ÙÜó 	<Ø�K‰K�O‰O˜T¤9×#7Ò#7Ó#9Ð:Ö;ð	<ûð �K‰K�O‰OÔ.Ó0Õ1úsœ   ®E< Á D8 Á E< Á6E	 ÂA9E< Ä G ÄE< Ä8
EÅE< ÅG ÅEÅE< Å	
E)ÅE$ÅE, Å$E)Å)E, Å,E9Å9E< Å<
GÆG Æ9GÇG ÇGÇG Ç%G,c           	      óö   • U R                   nUc  [        S5      e UR                  [        5        g ! [        R
                  [        4 a,  n[        SU  S[        [        5       SU< 35         S nAg S nAff = f)Nz5Should never access `._popen` before calling `.run()`zFailed to wait for z completion (timeout=rì   )	rn   Ú
ValueErrorr˜   ÚWAIT_COMPLETED_TIMEOUTrš   r›   r�   r   r   )r%   r}   r�   s      r&   r™   ÚWorkerThread._wait_completedž  sz   € Ø—‘ˆà‰=ÜÐTÓUÐUð	&Ø�J‰JÔ-Õ.øÜ×)Ñ)¬7Ð3ó 	&ÜÐ/°¨vð 6&Ü&5Ô6LÓ&MÐ%NÈcØ ™Gð%÷ &ñ &ûð	&ús   œ2 ²A8Á"A3Á3A8rm   c                 ó  •  U R                  S5        U R                  5       (       d  g [        R                  " 5       U-
  nU R	                  SU  S[        U5       35        U[        :”  a  [        SU  S[        U5       35        g M†  )Ng      ð?zWaiting for z thread for zFailed to join z in )rz   rv   rk   rl   ri   r   ÚWAIT_KILLED_TIMEOUTr   )r%   rm   r~   s      r&   Úwait_stoppedÚWorkerThread.wait_stopped«  s|   € ð à�I‰I�cŒNØ—=‘=—?‘?ØÜ—’Ó! JÑ.ˆBØ�H‰H�| D 6¨´oÀbÓ6IÐ5JÐKÔLØÔ'Ó'Ü °¨v°T¼/È"Ó:MÐ9NÐOÔPØñ r)   )ro   rn   rp   ri   rf   re   rd   rm   rQ   rh   r_   ©rb   Nr    )#r8   r9   r:   r;   Úintr'   rG   r   r�   r6   r   r   r�   rî   rï   r   r«   Útupler   r»   r   rÄ   ÚlistrÓ   rÛ   r   rç   rA   r÷   r  r™   Úfloatr
  r=   rZ   r[   s   @r&   r]   r]   l   si  ø† ð #ð ¨|ð À÷ ð'˜#ô 'ô =ô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2ô<&ð uð °÷ ò r)   r]   Úworkersrb   c                 ó8  • / nU  Hk  nUR                   nU[        :X  a  M  [        R                  " 5       UR                  -
  nU[
        :¼  d  MI  U S[        U5       S3nUR                  U5        Mm     U(       d  g S[        U5       SSR                  U5       3$ )Nrê   rë   z	running (rì   rí   )
rQ   rj   rk   rl   rm   r   r   rw   rò   rz   )r  rs   ÚworkerrQ   r~   Ú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S rSrS\S\S\S\SS4
S jrSS	 jr	SS
 jr
S\S-  4S jrS\SS4S jrS\S\4S jrSS jrSrg)ra   iÑ  Únum_workersrd   ÚloggerÚresultsrb   Nc                 ó  • Xl         X l        UR                  U l        UR                  U l        X@l        SU l        [        R                  " 5       U l        UR                  5       n[        U5      U l        UR                  U l        U R                  b,  [        U R                  S-  U R                  S-   5      U l        OS U l        / U l        U R                  R!                  5       nUb  [        U R                   U5      U l         g g )Nr   g      ø?i,  )r  rd   ri   Údisplay_progressr  Úlive_worker_countÚqueueÚQueuerf   Ú
iter_testsr   re   rh   Úminrg   r  Úget_jobs)r%   r  rd   r  r  r$   Újobss          r&   r'   ÚRunWorkers.__init__Ò  sØ   € à&ÔØ ŒØ—:‘:ˆŒØ &× 7Ñ 7ˆÔØ$+ŒØ!"ˆÔä16·²³ˆŒØ×(Ñ(Ó*ˆ
Ü+¨JÓ7ˆŒØ×'Ñ'ˆŒØ�<‰<Ñ#ô 14°D·L±LÀ3Ñ4FÈÏÉÐW]ÑH]Ó0^ˆDÕà"&ˆDÔØ+-ˆŒà�}‰}×%Ñ%Ó'ˆØÑô  # 4×#3Ñ#3°TÓ:ˆDÕð r)   c                 óf  • [        SU R                  S-   5       Vs/ s H  n[        X5      PM     snU l        U R                  R                  5       nUb  [        US5      nOSn[        U R                  5      n[        USS5      nSU SU SU 3nU R                  (       aA  U R                  b4  US	[        U R                  5      < S
[        U R                  5      < S3-  nU R                  U5        U R                   H(  nUR                  5         U =R                  S-  sl        M*     g s  snf )Nr	   r|   rÁ   ÚprocessÚ	processeszRun z in parallel using z worker z (timeout: z, worker timeout: rë   )Úranger  r]   r  rd   r!  r   rò   r   rh   rg   r   ri   Ústartr  )r%   Úindexr"  rÁ   Únworkersr&  rö   r  s           r&   Ústart_workersÚRunWorkers.start_workersî  s  € ä%*¨1¨d×.>Ñ.>ÀÑ.BÔ%CóEÚ%C˜Eô % UÖ1Ù%CñEˆŒà�}‰}×%Ñ%Ó'ˆØÑÜ˜$ Ó'‰EàˆEÜ�t—|‘|Ó$ˆÜ˜8 Y°Ó<ˆ	Ø�e�WÐ/Ø�˜8 I ;ð0ˆà�<�<˜D×/Ñ/Ñ;ÙÜ& t§|¡|Ö4Ü& t×':Ñ':Ö;ð=ñ >ˆCð 	�‰�ŒØ—l”lˆFØ�L‰LŒNØ×"Ò" aÑ'×"ò #ùò!Es   œD.c                 ó¼   • [         R                  " 5       nU R                   H  nUR                  5         M     U R                   H  nUR	                  U5        M     g r    )rk   rl   r  r6   r
  )r%   rm   r  s      r&   Ústop_workersÚRunWorkers.stop_workers  sA   € Ü—^’^Ó%ˆ
Ø—l”lˆFØ�K‰KŽMñ #à—l”lˆFØ×Ñ 
Ö+ò #r)   c                 ó  • U R                   R                  nU R                  S LnU R                  S:”  al  U(       a  [        R
                  " [        SS9   U R                  R                  [        S9n[        U[        5      (       a  U =R                  S-  sl        Mz  U$ g ! [        R                   a     Of = fU(       d-  [        U R                  5      nU(       a  U R!                  U5        U R                  S:”  a  MÍ  Nb)Nr   T)Úexitr—   r	   )rd   Úpgorh   r  ÚfaulthandlerÚdump_traceback_laterÚMAIN_PROCESS_TIMEOUTrf   ÚgetÚPROGRESS_UPDATEÚ
isinstancerI   r  ÚEmptyr  r  ri   )r%   r2  Úuse_faulthandlerrC   rs   s        r&   Ú_get_resultÚRunWorkers._get_result
  sÖ   € Ø�m‰m×ÑˆØ ŸL™L°Ð4Ðð ×$Ñ$ qÓ(ÞÜ×1Ò1Ô2FØ7;ò=ðØŸ™Ÿ™´˜ÐA�Ü˜fÔ&8×9Ñ9Ø×*Ò*¨aÑ/Õ*ÙØ�ð øô —;‘;ó Ùðúö ä% d§l¡lÓ3�ÞØ—H‘H˜WÔ%ð' ×$Ñ$ qÖ(s   ÁAB" ÂB" Â"B9Â8B9rV   c                 óÂ  • UR                   nU R                  R                  n[        U5      nUR                  (       a  USUR                  -  -  nOGUR
                  (       a6  UR
                  [        :¼  a"  U(       d  US[        UR
                  5      -  -  nU(       d$  [        U R                  5      nU(       a  USU 3-  nU R                  U R                  U5        g )Nz (%s)z -- )rC   rd   r2  rG   rE   rü   r   r   r  r  r  Ú
test_index)r%   rV   rC   r2  r  rs   s         r&   Údisplay_resultÚRunWorkers.display_result&  s©   € Ø×!Ñ!ˆØ�m‰m×Ñˆä�6‹{ˆØ××à�G˜i×/Ñ/Ñ/Ñ/‰DØ�o�o &§/¡/Ô5FÓ"FÎsØ�Gœo¨f¯o©oÓ>Ñ>Ñ>ˆDÞÜ! $§,¡,Ó/ˆGÞØ˜$˜w˜iÐ(Ñ(�Ø×Ñ˜dŸo™o¨tÕ4r)   Úitemc                 ó4  • US   (       aR  US   n[        SU 35        [        S[        R                  S9nU R                  R                  X0R                  5        U$ U =R                  S-  sl        US   nUR                  nU R                  R                  X0R                  5        U R                  U5        U R                  R                  (       d  SnOUR                  [        R                  :g  nU(       a  UR                  nU(       a
  [        USS9  U$ )z&Returns True if test runner must stop.r   r	   zregrtest worker thread failed: z<regrtest worker>rU   T)rƒ   )r   r   r   rÚ   r  Úaccumulate_resultrd   r>  rC   r?  rÀ   rS   ÚPASSEDrD   r„   )r%   rA  r  rC   rV   Úshow_stdoutrR   s          r&   Ú_process_resultÚRunWorkers._process_result6  sÞ   € à��7à˜a™ˆJÜÐ;¸J¸<ÐHÔIÜÐ 3¼5×;KÑ;KÑLˆFØ�L‰L×*Ñ*¨6·=±=ÔAØˆMà�Š˜1Ñ�Ø˜‘Gˆ	Ø×!Ñ!ˆØ�‰×&Ñ& v¯}©}Ô=Ø×Ñ˜IÔ&ð �}‰}×.×.Ø‰Kð "Ÿ<™<¬5¯<©<Ñ7ˆKÞØ×,Ñ,ˆFÞÜ�f DÒ)àˆr)   c                 óš  • U R                   R                  nU R                   R                  nU R                  5         SU l          U R                  5       nUc  O*U R                  U5      nUR                  X5      (       a  OM>  U R                  b  [        R                  " 5         U R                  R!                  5         U R#                  5         g ! [         a    [        5         SU R                  l         Ntf = f! U R                  b  [        R                  " 5         U R                  R!                  5         U R#                  5         f = f)Nr   T)rd   rú   rû   r+  r>  r;  rF  rþ   ÚKeyboardInterruptr„   r  Úinterruptedrh   r3  Úcancel_dump_traceback_laterre   r6   r.  )r%   rú   rû   rA  rC   s        r&   r  ÚRunWorkers.runS  s
  € Ø—M‘M×+Ñ+ˆ	ØŸ=™=×9Ñ9Ðà×ÑÔàˆŒð	 ØØ×'Ñ'Ó)�Ø‘<Øà×-Ñ-¨dÓ3�Ø×#Ñ# I×@Ñ@Øñ ð �|‰|Ñ'Ü×8Ò8Ô:ð �L‰L×ÑÔØ×ÑÕøô !ó 	,ÜŒGØ'+ˆD�L‰LÖ$ð	,ûð �|‰|Ñ'Ü×8Ò8Ô:ð �L‰L×ÑÔØ×ÑÕús=   ÁC ÁC< Á'C ÂC< ÂC Ã%C9Ã6C< Ã8C9Ã9C< Ã<AE
)r  r  ri   r  rf   re   r  rd   r>  rh   rg   r  r  )r8   r9   r:   r;   r  r   r
   r   r'   r+  r.  ÚQueueOutputr;  rA   r?  r   rF  r  r=   r+   r)   r&   ra   ra   Ñ  st   † ð; Cð ;°8ð ;Øð;Ø*5ð;Ø:>ô;ô8(ô*,ð˜[¨4Ñ/ô ð85Ð(:ð 5¸tô 5ð  Kð °Jô ÷: r)   ra   )Grî   Údataclassesr3  Úos.pathr‡   r  r‰   rš   r…   r§   r!   rk   r   Útypingr   r   r   r|   r   Útest.supportr   r   r  r
   rC   r   r   r  r   rd   r   r   r   r   Úsingler   Úutilsr   r   r   r   r   r   r   r  r   r   r¥   r³   r7  r5  r  r	  r   Ú	dataclassrA   rI   rG   ÚExcStrr  rM  ÚQueueContentrÙ   rL   rO   rj   ÚThreadr]   r  r  ra   r+   r)   r&   Ú<module>rX     sr  ðÛ Û Û Û Û Û Û Û 
Û Û Û Û ß 'Ñ 'å ß .å ß %Ý  ß FÓ FÝ %÷D÷ Dñ D÷ =æÛÛð
 €ØÐ+Ó+Ð +Ð+ð
  Ð Ø˜Ó.Ð .Ð.ð Ð ð Ð ÷#ñ #ð, ×Ò˜T¨$Ñ/÷ð ó 0ð÷4ñ 4ð 
€Ø�G˜E‘NÐ$6Ð6Ñ7¸%ÀÈÁÈvÐ@UÑ:VÑV€ØÐ/Ñ/€ô	�ô 	ô�)ô ð €ôS�9×#Ñ#ô Sðl
=˜˜lÑ+ð =°°d±
ô =÷\ ò \ r)   