U g@sddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z dZ dZ de e dZdZdZGd d d ZdS) N)support) print_warningi <zDSOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguagec@sReZdZdZddZddZddZdd d Zd d Zd dZ ddZ ddZ dS)WindowsLoadTrackerz This class asynchronously interacts with the `typeperf` command to read the system load on Windows. Multiprocessing and threads can't be used here because they interfere with the test suite's cases for those modules. cCs$g|_d|_d|_d|_|dS)N)_values_load_buffer_popenstartselfr0/usr/lib/python3.8/test/libregrtest/win_utils.py__init__$s zWindowsLoadTracker.__init__c Csdtt}tj}|tjO}|tjO}t||tjdt t tj tj |_ t |tjdtj tjdtj }t|d}tj|j dd}|d|}d|dttg}tjd||tjd |_t|dS) Nz\\.\pipe\typeperf_output_rrT) overlappedZtypeperfz-si )stdoutcwd)struuidZuuid4_winapiZPIPE_ACCESS_INBOUNDZFILE_FLAG_FIRST_PIPE_INSTANCEZFILE_FLAG_OVERLAPPEDZCreateNamedPipeZ PIPE_WAITBUFSIZEZNMPWAIT_WAIT_FOREVERZNULLpipeZ CreateFileZ GENERIC_WRITEZ OPEN_EXISTINGmsvcrtZopen_osfhandleZConnectNamedPipeGetOverlappedResult_get_counter_nameSAMPLING_INTERVAL subprocessPopenjoinrZSAVEDCWDr osclose)rZ pipe_nameZ open_modeZpipe_write_endZcommand_stdoutZoverlapZ counter_nameZcommandrrrr +s<    zWindowsLoadTracker.startc Csbttjt}t|dd}W5QRXt|}tt||}|d}|d}d|d|dS)NCounterr2Z44z"\\")winregOpenKeyHKEY_LOCAL_MACHINECOUNTER_REGISTRY_KEYZ QueryValueExiterdictzip)rZperfkeyZcountersZ counters_dictsystemZprocess_queue_lengthrrrrMsz$WindowsLoadTracker._get_counter_nameTcCs6|jdkrdSd|_|r"|j|jd|_dSN)r r killwait)rr2rrrr$\s   zWindowsLoadTracker.closecCs |dSr1)r$rrrr__del__gszWindowsLoadTracker.__del__cCsN|d}t|dkrt|d}|dr6|ds:t|dd}t|S)N,rr()splitlen ValueError startswithendswithfloat)rlinetokensvaluerrr _parse_linejs   zWindowsLoadTracker._parse_linecCst|jtd\}}|d\}}|dkr.dS|}|dd}|j|}|d}z| |dWn t k r| d|_YnXd|_|S) NTFrrZoemreplacer7r) rZReadFilerrr getbufferdecoder splitlinesrAr:pop)rr_Z bytes_readresoutputlinesrrr _read_linesxs   zWindowsLoadTracker._read_linesc Cs|jdkrdS|j}|dk r0|jdddSz |}Wntk rZ|YdSX|D]}|}d|krvq`|s|q`z||}Wn$tk rtd|Yq`YnX|j dk r|j t |dt |_ q`t |j t kr|j |q`t|j t |j |_ q`|j S)NF)r2zPDH-CSVz#Failed to parse typeperf output: %ag?)r Zpollr$rKBrokenPipeErrorrstriprAr:rr LOAD_FACTOR_1r9r NVALUEappendsum)r returncoderJr>Zprocessor_queue_lengthrrr getloadavgs<        zWindowsLoadTracker.getloadavgN)T) __name__ __module__ __qualname____doc__rr rr$r4rArKrSrrrrrs" r)rZmathrr#r rr)ZtestrZtest.libregrtest.utilsrrrZexprNrOr,rrrrrs