B t `¾vã@sÎddddddddgZdd lmZdd lZdd lZdd lZdd lZdd lZdd lZdd l m Z dd l m Z ej  d ¡Zer€dd lZyeƒeZWn$ek r²Gdd„deƒZYnXdZy:eräddlmZddlmZddlmZn ddlmZWndZYnXdd lZddlm Z ddl!m"Z"ye#Wne$Z%Z#YnXej  d¡rZd Z&d Z'n ej&Z&ej'Z'ej(dd…dkr„dd„Z)ndd„Z)ej(dkr ej*Z+nej,Z+ej-dfd d!„Z.d e_/d e_0de_1d"d#„Z2dEd$d„Z3d%d&„Z4d'd(„Z5d)d*„Z6dFd+d„Z7e7Z8Gd,d„de9ƒZ:e;d-kr²eeƒe @d¡es^e:d5ƒZ>e> A¡ee> A¡xe>jBjCD]ZDee7d5ƒ\ZEZFeƒe7de> A¡eePór")rrcCs®|j}tjs|r td||fƒtrZd}tjj |d|¡}tjj  |d¡tjj  |¡nPt   |¡}|dkr‚td|ƒt  d¡t  |tj¡| ¡tjdk rªdtj_dS)z+ Kill a process given a process ID z!Killing process %d with signal %déFéÿÿÿÿz ERROR: invalid pid %dN)Úpidr ÚdebugÚprintÚ _mswindowsÚctypesÚwindllÚkernel32Z OpenProcessZTerminateProcessZ CloseHandleÚosÚgetpgidÚsysÚexitÚkillpgÚsignalÚSIGTERMÚ terminateÚcurrent_processÚ_child_created)ÚprocessÚsigÚverboser&ZPROCESS_TERMINATEÚhandleZpgidrrrÚ kill_process`s"      r;cCs2|j}td|j|j|jƒtdƒt||dƒdS)Nz Signal handler called from z Waiting...T)Úf_coder(Ú co_filenameÚco_nameÚf_linenor)ÚsignumÚframeÚcrrrÚverbose_signal_handler‹s  rCcCs†tjr"tdƒtdƒt | ¡tjdkrLtd|dƒtdƒt | ¡tjdk r(tjjdk r(tj ¡dkr(dt_ttj|ƒ|ržtdtjjd|ƒt ƒd }x,t ƒ|krÔtj ¡}|dkrÈPt   d ¡qªWtj ¡}|dk rd t_|rütd ƒt d t |ƒƒ‚nt dt tjjƒƒ‚dt_x(ttjƒD]}t |tj |¡¡q4Wt |¡}t|dƒrr|||ƒt d t |ƒƒ‚dS)NÚz$ Signal handler is busy. Aborting.z Signalzrecieved, but no process queuedz Exiting nowTz Signaled processz with signalgð?gš™™™™™¹?FzDone.zInterrupted by signal zProblem terminating processÚ__call__)r Úsignal_handler_busyr(r/r0r5r&Úpollr;rÚtimeÚsleepÚOSErrorÚreprÚlistÚoriginal_signal_handlersr2ÚpopÚ getsignalÚhasattr)r@rAr9ÚendtimeÚstatusÚ_sigZ orig_handlerrrrr“sJ               c s´|d}|d}tdd„|dd…Dƒƒ‰‡fdd„}‡fdd „}tj}|dkrVtj}y |j}Wnd}YnX|dkr’y |j}Wn YnX|dkržd }d }d}xžt |d¡} | sºP|rÈ|| 7}n| }| |¡} |  |¡|kræq¨d }|dkrú|| ƒ} || 7}| d d krq¨|r2|dkr*||ƒ} |ƒn||ƒ} | r¨d }q¨Wd} |r\| ||ƒM} |rt| || |¡ƒM} |ƒ| s°|dk r°|  d|f¡|r°|  d|f¡dS)Nr r$css|]}|dk r|VqdS)Nr)Ú.0r rrrú Èsz!_stream_reader..rc s>d}x4ˆD],}y| |¡Wq tk r4d}Yq Xq W|S)NTF)ÚwriteÚ ValueError)r ÚsuccessÚs)ÚoutputrrrVÊs z_stream_reader..writec s4x.ˆD]&}y | ¡Wqtk r*YqXqWdS)N)ÚflushrW)rY)rZrrr[Ós   z_stream_reader..flushzutf-8rDr%Ú Tz¬ ERROR: pyutilib.subprocess: output stream closed before all subprocess output was written to it. The following was left in the subprocess buffer: '%s' zJThe following undecoded unicode output was also present: '%s' ) Útupler/Ú __stderr__ÚstderrÚencodingr-ÚreadÚdecoderrV) ÚargsÚunbufferÚstreamrVr[Ú raw_stderrr`ÚbufÚdataÚnew_dataÚcharÚwriteOKr)rZrÚ_stream_readerÅsp          rlcsžGdd„dtƒ}tj}|dkr$tj}y tj}Wnd}YnX|dkr`y |j}Wn YnX|dkrld}i‰x|D]}||Ž}|ˆ|j<qvWtˆ ¡‡fdd„d}g}x^|r t r$d}xT|D]L} y,t | dƒd} | dkräwÆt | ddƒ\} }WqÆ|  | ¡d}YqÆXqÆW|dkrbq°n>t |||ƒd} | s.StreamData)rarZrdrgrhcWsTtrt|dƒ|_n |d|_|d|_tdd„|dd…Dƒƒ|_d|_d|_dS)Nr$r css|]}|dk r|VqdS)Nr)rTr rrrrU.sz>_merged_reader..StreamData.__init__..rrD)r)rrardr]rZrgrh)ÚselfrcrrrÚ__init__(s  z+_merged_reader..StreamData.__init__c Ss@d}x6|jD],}y| |¡Wq tk r6d}Yq Xq W|S)NTF)rZrVrW)rmr rXrYrrrrV2s z(_merged_reader..StreamData.writec Ss6x0|jD]&}y | ¡Wqtk r,YqXqWdS)N)rZr[rW)rmrYrrrr[;s   z(_merged_reader..StreamData.flushN)rrrÚ __slots__rnrVr[rrrrÚ StreamData%s  rpzutf-8csdˆ|jS)Nr%)rd)r )Ústreamsrrr"Yr#z _merged_reader..)Úkeyr r$r%r\rDTz¬ ERROR: pyutilib.subprocess: output stream closed before all subprocess output was written to it. The following was left in the subprocess buffer: '%s' zJThe following undecoded unicode output was also present: '%s' )Úobjectr/r^r_rer`raÚsortedÚkeysr)rrÚremoverr-rhrbrrdrVrgr[r )rcrprfr`rYÚtmpZhandlesZnoopriÚhZnumAvailÚresultrjrkr)rqrÚ_merged_reader#s”                 rzc Gsbg}xB|D]:}| ttd|dd…fd¡d|d_|d ¡q Wx|D] }| ¡qNWdS)N)rr$)ÚtargetrcTr%)Úappendr rlÚdaemonÚstartÚjoin)rcÚ_threadsÚargÚthrrrÚ_pseudo_merged_reader¢s    rƒc- Cst| dkrtj} |dk r(t ¡}t |¡t|ƒ}|tkrF|dd…}n|tkrXt|ƒ}n t|  ¡ƒ}| r”t j   d¡} | dkr„t dƒ‚| d|  ¡¡|r&t j   d¡}|dkr¶t dƒ‚| ¡g}| dkrÔ| d¡n.t| ƒttfkrð| | ¡n| t|   ¡ƒ¡|dk r| d|  ¡¡||}d}|dk rh|}}|dk sZ|dk sZ|dk rbtdƒ‚d }nx|dk r¦t|d ƒ}}|dk s”|dk rœtd ƒ‚d |}n:|dkrº|dksÈ|}|}d }ntjdd}}}d}||kry"|r|ds |ds t}Wn YnX| dkr.tj ¡} | r¬|r>tnt}tjdd…dkr€tjdd…dkr€t tj|¡tjtj<t tj |¡tjtj <t tj!|¡tjtj!<d}| rÄt"d|fƒzty y.| }|dk ræ| #¡|dk rø| #¡Wnd}YnXg}d} dt_$|rPt%||||| |d}!|!j&t_'|! (|¡}dt_'n˜g}"xödD]î}#|#dkrv|tj)}$}%n |tj*}$}%y ||#}&Wn|}&YnX|$dks´|$tkrÀ|" |$¡n†|&sy|$ #¡|" |$¡Wn8t +¡\}'}(|" |(¡| |#|'|$f|'|(f¡YnXn.t +¡\}'}(|" |(¡| |#|'|%|$f|'|(f¡qZWt%|||"d|"d| |d}!|!j&t_'dt_$|rÔ|dk rŒ|})n$t,|ƒdkr t-})nt.r¬t/})nt0})t1|)dd„|Dƒd} d| _2|  3¡|! (|¡}dt_'d}"WnLt4k r"t 5¡d}*t6dd  7|¡|*fƒ‚Ynt8k r6YnXWdx(ttjƒD]}+t |+tj 9|+¡¡qHWXytj) :¡Wnt;k rŒYnXytj* :¡Wnt;k r²YnX|rx|D]},t <|,d!¡qÀW| dk rê|  7¡x|D]},t <|,d¡qðW| dk r~ |dk r(| <¡n0|dk rX|sX| =d¡d 7| >¡¡}| <¡|dk rlt |¡||gS)"NÚmemmonz&Unable to find the 'memmon' executabler Úvalgrindz(Unable to find the 'valgrind' executable)z-vz--tool=memcheckz--trace-children=yesz--log-file-exactly=z_subprocess.run_command(): ostream, outfile, and {stdout, stderr} options are mutually exclusivez#Output printed to specified ostreamÚwzUsubprocess.run_command(): outfile and {stdout, stderr} options are mutually exclusivezOutput printed to file '%s'z5Output printed to specified stdout and stderr streamszw+)ÚmoderDr$rr érr%zExecuting command %sF)ÚstdinÚstdoutr_ÚenvÚshell)r r$cSsg|] }|d‘qS)r r)rTr rrrú szrun_command..)r{rcTz6Could not execute the command: '%s' Error message: %sú r)?r ZDEFINE_SIGNAL_HANDLERS_DEFAULTr-ÚgetcwdÚchdirÚtyperLr]rÚstripÚpyutilibÚservicesZregistered_executableÚIOErrorÚinsertÚget_pathÚextendr|rWÚopenÚtempfileÚ TemporaryFilerÚenvironÚcopyrCrr/Úplatformr2ÚSIGHUPrMÚSIGINTr3r(ÚfilenorFrr7r5ÚwaitrŠr_ÚpipeÚlenrlÚ_peek_availablerzrƒr r}r~rÚexc_inforrrJrNr[ÚAttributeErrorÚcloseÚseekÚ readlines)-ÚcmdÚoutfileÚcwdZostreamr‰rŠr_r…Z valgrind_logZvalgrind_optionsr„r‹Zdefine_signal_handlersr'r9Ú timelimitÚteeZ ignore_outputrŒZ thread_readerZoldpwdZcmd_typeZ_cmdZ valgrind_cmdZtmpfileZ stdout_argZ stderr_argrZÚhandlerÚrcZ simpleCaseZout_thr‚r7Zout_fdZfidrYÚrawZtee_fidÚrr†ÚreaderÚerrrSÚprrrr±sN              (                             c@sFeZdZddd„Zdd„Zddd „Zd d „Zd d „Zej fdd„Z dS)rNr Fc Cs°d|_||_|dkrd}ntj}t|ƒttfkr|jdk r>y|j ¡dkr&| ¡Wntk r<YnX|jdk r^y|`Wn YnXd|_dS)zI Cleanup temporary file descriptor and delete that file. FN)r7rGÚkillrJ)rmrrrÚX__del__%s  zSubprocessMngr.X__del__cCsò|dkr$|jjt|jƒd|jjS|dkr4tdƒ‚tƒ|}|jdk r\|jj t|jƒ¡x.tƒ|krŠ|j ¡}|dk r~|St   d¡q^W|j ¡}|dk r¢|Sy |  ¡dSt k rì|j ¡}|dk rÔ|St dt |jjƒƒ‚YnXdS)zo Wait for the subprocess to terminate. Terminate if a specified timelimit has passed. N)Úinputr z#'timeout' must be a positive numbergš™™™™™¹?r%zCould not kill process )r7Ú communicater!r‰Ú returncoderWrrVrGrHrIr¾rJrKr&)rmr®rQrRrrrr¢=s2      zSubprocessMngr.waitcCs|jjS)N)r7rŠ)rmrrrrŠtszSubprocessMngr.stdoutcCst |j|¡dS)z/ Send a signal to a subprocess N)r-r2r7)rmr8rrrÚ send_signalwszSubprocessMngr.send_signalcCs.t|j|ƒ|j ¡|j ¡|`d|_dS)z6 Kill the subprocess and its children N)r;r7r4r¢)rmr8rrrr¾}s    zSubprocessMngr.kill)NNNNr F)N) rrrrnr¿r¢rŠrÃr2r3r¾rrrrrÛs A 7Ú__main__ÚZz./dummyé )r¯r®ÚAzRan for z secondszls *pyrD)rŠrw)r¬r³ÚXz!python -c "while True: print '.'")r®ÚY)r9zY-endz cmd /C "dir"zpython -c "while True: pass"r…r„)F)NNNNNNFNNFNNFTNNFFN)LÚ__all__Zpyutilib.subprocessr rHr2r-r/ršrÚsixr Ú threadingr ržÚ startswithr)r*Z WindowsErrorrÚ NameErrorÚ Exceptionr¥ÚmsvcrtrZ win32piperZ win32filerrZpyutilib.servicesr“Zpyutilib.commonrZ pyutilib.miscrÚunicodeÚstrrrrÚ version_infor!Ú perf_counterrÚclockr3r;r5r&rFrCrrlrzrƒrrrsrrr(ZstimeZfoorKr0r¢r7rŠÚliner±rZr™ZINPUTr¨r”Zregister_executablerrrrÚ sô            # 2^ .