Rh\W^ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZmZmZddlmZddlmZmZddlmZddlmZmZddlmZdd lmZmZm Z m!Z!dd l"m#Z#dd l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+dd l,m-Z-m.Z.erddl/Z/ddl0Z0d Z1e1e#k\sJdZ2e2e1k\sJd Z3dZ4GddZ5ejlddGddZ7e8Z9e:ede7fe:ede9fzZ;Gdde<Z=Gdde<Z>Gdde j~Z@deAe@de8dzfdZBGd d!ZCy)"N)AnyLiteralTextIO)support) os_helper MS_WINDOWS)Logger) TestResultState) TestResults)RunTestsWorkerRunTestsJsonFile JsonFileType)PROGRESS_MIN_TIME)StrPathTestNameformat_duration print_warningcountpluralget_signal_name)create_worker_processUSE_PROCESS_GROUPg>@gr@gN@c(eZdZdZdZdZdZdZy)MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.cDtj|_||_yN) threadingLocklock tests_iter)selfr#s 3/usr/lib/python3.12/test/libregrtest/run_workers.py__init__zMultiprocessIterator.__init__8sNN$ $c|Srr$s r%__iter__zMultiprocessIterator.__iter__<s r'c|j5|jtt|jcdddS#1swYyxYwr)r"r# StopIterationnextr*s r%__next__zMultiprocessIterator.__next__?s: YY )&##( ) ) )s '>AcT|j5d|_dddy#1swYyxYwr)r"r#r*s r%stopzMultiprocessIterator.stopEs% YY #"DO # # #s'N)__name__ __module__ __qualname____doc__r&r+r/r1r)r'r%rr4sB%) #r'rT)slotsfrozenc@eZdZUeed<dZedzed<dZedzed<y)MultiprocessResultresultN worker_stdouterr_msg)r2r3r4r __annotations__r;strr<r)r'r%r9r9Js$  $M3:$GS4Zr'r9Fc eZdZy) ExitThreadN)r2r3r4r)r'r%r@r@Vsr'r@c<eZdZdededzdedzdeffd ZxZS) WorkerError test_namer<Nstdoutstatec`t||}t||||_t|y)NrE)r r9 mp_resultsuperr&)r$rCr<rDrEr: __class__s r%r&zWorkerError.__init__[s, IU3+FFGD r')r2r3r4rr>r& __classcell__rJs@r%rBrBZs9$*t r'rBc neZdZdeddddffd ZdefdZd!dZd!d Z d"d e d ed e dzdedzfd Z de jdefdZde jdeeedzffdZdedede fdZde dedeedzee ffdZdedefdZdededzdedeeeffdZdedefdZd!dZd!dZdeddfd ZxZ S)# WorkerThread worker_idrunner RunWorkersreturnNc t|||_|j|_|j|_|j |_|j |_|j|_d|_ d|_ d|_ d|_ d|_ y)NF)rIr&rOruntestspendingoutputworker_timeouttimeoutlogrC start_time_popen_killed_stopped)r$rOrPrJs r%r&zWorkerThread.__init__fsq " ~~ mm ,, ::*.(,48   r'cd|jg}|jr|jdn|jd|j}|r|jd||j}|Wt j |jz }|jd|jjdt|fddj|zS) NzWorkerThread #runningstoppedztest=zpid=ztime=z<%s> ) rOis_aliveappendrCr[time monotonicrZextendpidrjoin)r$infotestpopendts r%__repr__zWorkerThread.__repr__ts  012 ==? KK " KK "~~  KK%v '   !DOO3B KK4 01 !4 568 9&&r'c|j}|y|jryd|_tr|d}n|d}td|tj d tr/t j|jtjy|jy#t$rYyt$r}td|d|Yd}~yd}~wwxYw)NTz process groupz processzKill )fileflushzFailed to kill z: )r[r\rprintsysstderroskillpgrgsignalSIGKILLkillProcessLookupErrorOSErrorr)r$rkwhatexcs r%_killzWorkerThread._kills  =  <<  V>*DV8$D dVn3::T: =  %))V^^4 !   = OD6C7; < < =s$4B B C &C .CC c2d|_|jy)NT)r]r}r*s r%r1zWorkerThread.stops  r'rT output_fdtmp_dirc:t|||}||_d|_ |jr|j t  |j |j}|J||jd|_S#tj$r'|jrt |j d}Ynt$r|jrt wxYwn#|j xYw |jd|_y#|jd|_wxYw)NFrX) rr[r\r]r}r@waitrX_wait_completed subprocessTimeoutExpiredrz)r$rTrrrkretcodes r% _run_processzWorkerThread._run_processs%h 7C  & }}    **T\\*:***2  "DK3,, ==%$  ==%$     JJL   "DK  "DKs;"C!A997C0C2CCDC%%DDstackctrtj}ntjj }t jd|d}|j||S)z/Create stdout temporary file (file descriptor).w+backslashreplace)encodingerrors) rlocale getencodingrrrDrtempfile TemporaryFile enter_context)r$rr stdout_files r% create_stdoutzWorkerThread.create_stdoutsW ))+Hzz**H,,T6>4FH  K(r'c|jj}|r tdtj}d}||fSt j dd}|j||j}tr3tj|}t|tj}||fSt|tj}||fS)zCreate JSON file.Nrutf8r)rTjson_file_use_stdoutrrSTDOUTrrrfilenormsvcrt get_osfhandleWINDOWS_HANDLEUNIX_FD)r$rr json_file json_tmpfilejson_fd json_handles r%create_json_filezWorkerThread.create_json_files $}}AAC  |':':;IL<(($11$HL    -"))+G$*#7#7#@ $[%1%@%@B <((%Wl.B.BC <((r'rCrc*|f}|jjr|jj|}nd}i}|r|Dcgc]}|dfc}|d<|jjr d|d<d|d<|jjd||d|Scc}w)NT match_testsverboseFoutput_on_failure)testsrr))rTrerunget_match_testsrcreate_worker_runtests)r$rCrrrkwargsrjs r%rz#WorkerThread.create_worker_runtestss  ==  --77 BKK!# >I$JddD\$JF= ! == * * $F9 */F& '3t}}33  %Ks Bworker_runtests stdout_fdctjswtjd}tj j |} |j|||}t j|}tj|||fS|j||}g}||fS#t j|}tj|wxYw)N test_python_)prefix) ris_wasirmkdtemprtpathabspathrlistdirrrmtree)r$rrrr tmp_filess r% run_tmp_fileszWorkerThread.run_tmp_filess &&n=Gggoog.G *++O,5w@JJw/   ) ##''CGI## JJw/   )s B ,C rc|jd |jjS#t$r/}t |j d|dt jd}~wwxYw)NrzCannot read process stdout: )rDrE)seekreadstrip ExceptionrBrCr WORKER_BUG)r$rr|s r% read_stdoutzWorkerThread.read_stdout(sh 6##%++- - 6dnn cUCGdnngv$)$4$46 6  6sHA9C#;C C#>D C C## D,,DD E),EEc tj5}|j|}|j|\}}|j ||}|j ||j \}}|j|} |'t|j| dtj|dk7r?t|} | r|d| d}t|jd|| tj|j||| \} } dddrAd|dt|d d j!t#|}  | z }  j%t'  S#1swYXxYw) N)rDr<rEr ()z Exit code rGz Warning -- z leaked temporary files (): , ) contextlib ExitStackrrrrrrrBrCr TIMEOUTr WORKER_FAILEDrlenrhsortedset_env_changedr9) r$rCrrrrrrrrDnamer:msgs r%_runtestzWorkerThread._runtestVs  ! ! # Mu,,U3K&*&;&;E&B #I|"99)YOO"&!3!3O4?4F4F4H"J GY%%k2F!$..*.(- 77!|&w/!( D63G!$..Jwi2H&(-(;(;=="^^I|VLNFF- M0 !!* ,9~&c$))F94E*F)GIC cMF  " " $!&&11? M Ms C/EE$c|jj}|jj}|js t |j }tj|_ ||_ |j|}d|_ tj|jz |j_|j j#d|f|jj%||ry |jsyy#t $rYywxYw#t$r}|j}Yd}~d}~wwxYw#d|_ wxYw#t&$rYyt($r2|j j#dt+j,fYywxYw)NFT)rT fail_fastfail_env_changedr]r.rUr-rdrerZrCrrBrHr:durationrVput must_stopr@ BaseException traceback format_exc)r$rrrCrHr|s r%runzWorkerThread.runxsCMM++ ==99--  $T\\ 2I#'.."2!** $ i 8I&*DN,0NN,? slD E1DA0E D EDE D1 D,'D4,D11D44 D==E F 7FFc |j} |jty#tjt f$r+}t d|dttd|Yd}~yd}~wwxYw)NzFailed to wait for z completion (timeout=r)r[rWAIT_COMPLETED_TIMEOUTrrrzrr)r$rkr|s r%rzWorkerThread._wait_completedsi  & JJ- .))73 & /v6&&56L&M%Nc G% & & &s$A(!A##A(rZc |jd|jsytj|z }|j d|dt ||t kDrtd|dt |y~)Ng?z Waiting for z thread for zFailed to join z in )rhrbrdrerYrWAIT_KILLED_TIMEOUTr)r$rZrls r% wait_stoppedzWorkerThread.wait_stoppedsz IIcN==?!J.B HH|D6ob6I5JK L''vT/":M9NOPr'rRNr)!r2r3r4intr&r>rmr}r1rrrrrrrtuplerrrrlistrrr rr9rrrfloatrrKrLs@r%rNrNesd # |  '#' =8 04,^,,%n,8;d ,\:#7#7F,)j&:&:)uXvX\}E\?]),XR`$$^$!$$).sTz4=/H)I$. 6v 6# 6  8  6D=    "' C"8  D 2( 2/A 2D:&ur'rNworkersrRcg}|D]^}|j}|stj|jz }|tk\s=|dt |d}|j |`|sydt|ddj|S)Nrrz running (rr) rCrdrerZrrrcrrh)rr_workerrCrltexts r% get_runningrsG!$$   ^^  1 1 1 " "[?2#6"7q9D NN4 !  s7|nC '(:'; <.>.B%CE!%UD1E }}%%'  $'EEt||$8Y < eW/8I;0 << &t||4&t':':;= >C  ll F LLN !EsDctj}|jD]}|j|jD]}|j |yr)rdrerr1r)r$rZrs r% stop_workerszRunWorkers.stop_workerssK^^% ll F KKM ll ,F    + ,r'c,|jj}|jdu}td|jDr>|rt j td |jjtS |jjdS#tj$rYnwxYw|s(t|j}|r|j|td|jDr~#tj$rYywxYw)Nc3<K|]}|jywr)rb).0rs r% z)RunWorkers._get_result..s?&//#?sT)exitrr)rTpgorXanyr faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTrVgetPROGRESS_UPDATErEmptyrrY)r$ruse_faulthandlerr_s r% _get_resultzRunWorkers._get_resultsmm LL4?$,,??112F7;= {{?? ;;??1?- -;;  %dll3HHW%?$,,??({{  s$BC=B21B2=DDrHcv|j}|jj}t|}|jr|d|jzz }n0|j t k\r|s|dt|j zz }|st|j}|r|d|z }|j|j|y)Nz (%s)z -- ) r:rTrr>r<rrrrrr test_index)r$rHr:rrr_s r%display_resultzRunWorkers.display_results!!mm6{    Gi/// /Doo!223 Gofoo>> >D!$,,/G$wi(( doot4r'itemc|drV|d}td|tdtj}|jj ||j |S|xjdz c_|d}|j}|jj ||j |j||j jsd}n|jtjk7}|r|j}|r t|d|S)z&Returns True if test runner must stop.rr zregrtest worker thread failed: zrGT)rp)rr r rraccumulate_resultrTrr:rrrEPASSEDr;rq)r$rrr:rH show_stdoutrDs r%_process_resultzRunWorkers._process_result)s 7aJ ;J<H I 35;K;KLF LL * *64== AM 1G !! &&vt}}= I&}}..K"<<5<<7K ,,FfD) r'c|jj}|jj}|jd|_ |j }|n%|j |}|j||rn8|jtj|jj!|j#y#t$rtd|j_ YqwxYw#|jtj|jj!|j#wxYw)NrT)rTrrrrrr"rKeyboardInterruptrqr interruptedrXrcancel_dump_traceback_laterrUr1r )r$rrrr:s r%rzRunWorkers.runFs MM++ ==99  '')<--d3##I/?@||'88: LL       ! , G'+DLL $ ,||'88: LL       s%9C $C0-C3/C00C33A D?r)r2r3r4rrr r r&rr  QueueOutputrr9rr r"rr)r'r%rQrQst;C;8;;*5;:>;6(,[4/:5(:5t5 KJ: r'rQ)Dr dataclassesros.pathrtrrvrrrrr rdrtypingrrrrjr test.supportrrrr r:r r rr rTrrrrsinglerutilsrrrrrrrrrrrrrrrrr dataclassr9r>ExcStrrr'rr@rBThreadrNrrrQr)r'r%r1sX   ''.% FF%DDD=  ++++  ...##,T$/0 GEN$667% v@U:VV   )N9##Nb =l+ =d =[ [ r'