102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_ntperf_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_ntperf.c (c) Copyright 2005-2007, Hewlett-Packard Company, Version 2.4.3";
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h>
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h>
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdint.h>
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <limits.h>
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdlib.h>
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <math.h>
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <assert.h>
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <process.h>
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <windows.h>
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <assert.h>
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <winsock2.h>
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// If you are trying to compile on Windows 2000 or NT 4.0 you may
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// need to define DONT_IPV6 in the "sources" files.
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef DONT_IPV6
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <ws2tcpip.h>
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// System CPU time information class.
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Used to get CPU time information.
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//     SDK\inc\ntexapi.h
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Function x8:   SystemProcessorPerformanceInformation
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// DataStructure: SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SystemProcessorPerformanceInformation 0x08
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef struct
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   IdleTime;
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   KernelTime;
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   UserTime;
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   DpcTime;
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   InterruptTime;
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LONG                    InterruptCount;
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Calls to get the information
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project//
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef ULONG (__stdcall *NT_QUERY_SYSTEM_INFORMATION)(
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                                                        ULONG SystemInformationClass,
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                                                        PVOID SystemInformation,
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                                                        ULONG SystemInformationLength,
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                                                        PULONG ReturnLength
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                                                        );
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectNT_QUERY_SYSTEM_INFORMATION NtQuerySystemInformation = NULL;
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER TickHz = {0,0};
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project_inline LARGE_INTEGER ReadPerformanceCounter(VOID)
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER Counter;
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        QueryPerformanceCounter(&Counter);
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return(Counter);
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}       // ReadperformanceCounter
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* The NT performance data is accessed through the NtQuerySystemInformation
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   call.  References to the PDH.DLL have been deleted.  This structure
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   is the root for these data structures. */
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef struct sPerfObj
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   StartTime;
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LARGE_INTEGER   EndTime;
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION StartInfo[MAXCPUS +1];
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION EndInfo[MAXCPUS +1];
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} PerfObj, *PPerfObj;
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic PerfObj *PerfCntrs;
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Forward declarations
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectPerfObj *InitPerfCntrs();
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid RestartPerfCntrs(PerfObj *PerfCntrs);
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble ReportPerfCntrs(PerfObj *PerfCntrs);  /* returns CPU utilization */
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid ClosePerfCntrs(PerfObj *PerfCntrs);
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (NtQuerySystemInformation == NULL) {
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    // Open the performance counter interface
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    PerfCntrs = InitPerfCntrs();
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void)
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void)
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return NT_METHOD;
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef unsigned __int64    uint64_t;
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle(uint64_t *res)
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  RestartPerfCntrs(PerfCntrs);
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval)
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (float)0.0;
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  InitPerfCntrs() -
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  Changed to no longer access the NT performance registry interfaces.
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  A direct call to NtQuerySystemInformation (an undocumented NT API)
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  is made instead.  Parameters determined by decompilation of ntkrnlmp
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  and ntdll.
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project*/
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectPerfObj *InitPerfCntrs()
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PerfObj *NewPerfCntrs;
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD NTVersion;
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD status;
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SYSTEM_INFO SystemInfo;
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  GetSystemInfo(&SystemInfo);
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  NewPerfCntrs = (PerfObj *)GlobalAlloc(GPTR, sizeof(PerfObj));
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  assert(NewPerfCntrs != NULL);
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ZeroMemory((PCHAR)NewPerfCntrs, sizeof(PerfObj));
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // get NT version
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  NTVersion = GetVersion();
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (NTVersion >= 0x80000000)
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "Not running on Windows NT\n");
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // locate the calls we need in NTDLL
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  //Lint
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  NtQuerySystemInformation =
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (NT_QUERY_SYSTEM_INFORMATION)GetProcAddress( GetModuleHandle("ntdll.dll"),
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						 "NtQuerySystemInformation" );
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( !(NtQuerySystemInformation) )
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      //Lint
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      status = GetLastError();
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "GetProcAddressFailed, status: %X\n", status);
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // setup to measure timestamps with the high resolution timers.
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (QueryPerformanceFrequency(&TickHz) == FALSE)
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,"MAIN - QueryPerformanceFrequency Failed!\n");
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(2);
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  RestartPerfCntrs(NewPerfCntrs);
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(NewPerfCntrs);
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}  /* InitPerfCntrs */
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  RestartPerfCntrs() -
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  The Performance counters must be read twice to produce rate and
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  percentage results.  This routine is called before the start of a
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  benchmark to establish the initial counters.  It must be called a
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  second time after the benchmark completes to collect the final state
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  of the performance counters.  ReportPerfCntrs is called to print the
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  results after the benchmark completes.
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project*/
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid RestartPerfCntrs(PerfObj *PerfCntrs)
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD returnLength = 0;  //Lint
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD returnNumCPUs;  //Lint
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD i;
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DWORD status;
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SYSTEM_INFO SystemInfo;
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  GetSystemInfo(&SystemInfo);
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Move previous data from EndInfo to StartInfo.
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  CopyMemory((PCHAR)&PerfCntrs->StartInfo[0],
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (PCHAR)&PerfCntrs->EndInfo[0],
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*(MAXCPUS +1));
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PerfCntrs->StartTime = PerfCntrs->EndTime;
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // get the current CPUTIME information
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( (status = NtQuerySystemInformation( SystemProcessorPerformanceInformation,
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (PCHAR)&PerfCntrs->EndInfo[0], sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*MAXCPUS,
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   &returnLength )) != 0)
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "NtQuery failed, status: %X\n", status);
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PerfCntrs->EndTime = ReadPerformanceCounter();
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Validate that NtQuery returned a reasonable amount of data
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((returnLength % sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)) != 0)
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "NtQuery didn't return expected amount of data\n");
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "Expected a multiple of %i, returned %i\n",
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), returnLength);
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  returnNumCPUs = returnLength / sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION);
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (returnNumCPUs != (int)SystemInfo.dwNumberOfProcessors)
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "NtQuery didn't return expected amount of data\n");
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr, "Expected data for %i CPUs, returned %i\n",
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (int)SystemInfo.dwNumberOfProcessors, returnNumCPUs);
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Zero entries not returned by NtQuery
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ZeroMemory((PCHAR)&PerfCntrs->EndInfo[returnNumCPUs],
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (MAXCPUS +1 - returnNumCPUs));
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Total all of the CPUs
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  //      KernelTime needs to be fixed-up; it includes both idle &
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // true kernel time
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  //  Note that kernel time also includes DpcTime & InterruptTime, but
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // I like this.
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i=0; i < returnNumCPUs; i++)
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[i].KernelTime.QuadPart         -= PerfCntrs->EndInfo[i].IdleTime.QuadPart;
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].IdleTime.QuadPart     += PerfCntrs->EndInfo[i].IdleTime.QuadPart;
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].KernelTime.QuadPart   += PerfCntrs->EndInfo[i].KernelTime.QuadPart;
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].UserTime.QuadPart     += PerfCntrs->EndInfo[i].UserTime.QuadPart;
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].DpcTime.QuadPart      += PerfCntrs->EndInfo[i].DpcTime.QuadPart;
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].InterruptTime.QuadPart += PerfCntrs->EndInfo[i].InterruptTime.QuadPart;
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      PerfCntrs->EndInfo[MAXCPUS].InterruptCount                += PerfCntrs->EndInfo[i].InterruptCount;
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}   /* RestartPerfCntrs */
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ReportPerfCntrs() -
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  This routine reports the results of the various performance
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  counters.
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project*/
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble ReportPerfCntrs(PerfObj *PerfCntrs)
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double tot_CPU_Util;
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int duration;  // in 100 usecs
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  LARGE_INTEGER ActualDuration;
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION        DeltaInfo[MAXCPUS +1];
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  LARGE_INTEGER   TotalCPUTime[MAXCPUS +1];
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SYSTEM_INFO SystemInfo;
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  GetSystemInfo(&SystemInfo);
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i=0; i <= MAXCPUS; i++)
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].IdleTime.QuadPart    = PerfCntrs->EndInfo[i].IdleTime.QuadPart -
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].IdleTime.QuadPart;
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].KernelTime.QuadPart          = PerfCntrs->EndInfo[i].KernelTime.QuadPart -
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].KernelTime.QuadPart;
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].UserTime.QuadPart    = PerfCntrs->EndInfo[i].UserTime.QuadPart -
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].UserTime.QuadPart;
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].DpcTime.QuadPart     = PerfCntrs->EndInfo[i].DpcTime.QuadPart -
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].DpcTime.QuadPart;
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].InterruptTime.QuadPart = PerfCntrs->EndInfo[i].InterruptTime.QuadPart -
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].InterruptTime.QuadPart;
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DeltaInfo[i].InterruptCount               = PerfCntrs->EndInfo[i].InterruptCount -
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	PerfCntrs->StartInfo[i].InterruptCount;
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      TotalCPUTime[i].QuadPart =
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DeltaInfo[i].IdleTime.QuadPart +
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DeltaInfo[i].KernelTime.QuadPart +
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DeltaInfo[i].UserTime.QuadPart;
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      // KernelTime already includes DpcTime & InterruptTime!
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      // + DeltaInfo[i].DpcTime.QuadPart  +
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      //  DeltaInfo[i].InterruptTime.QuadPart;
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tot_CPU_Util = 100.0*(1.0 - (double)DeltaInfo[MAXCPUS].IdleTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);  //Lint
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Re-calculate duration, since we may have stoped early due to cntr-C.
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ActualDuration.QuadPart = PerfCntrs->EndTime.QuadPart -
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    PerfCntrs->StartTime.QuadPart;
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // convert to 1/10 milliseconds (100 usec)
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ActualDuration.QuadPart = (ActualDuration.QuadPart*10000)/TickHz.QuadPart;
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  duration = ActualDuration.LowPart;
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1)
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"ActualDuration (ms): %d\n", duration/10);
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1)
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "%% CPU    _Total");
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t CPU %i", i);
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n");
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Busy      %5.2f", tot_CPU_Util);
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.2f",
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      100.0*(1.0 - (double)DeltaInfo[i].IdleTime.QuadPart/(double)TotalCPUTime[i].QuadPart));  //Lint
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n");
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Kernel    %5.2f",
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      100.0*(double)DeltaInfo[MAXCPUS].KernelTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);  //Lint
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.2f",
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      100.0*(double)DeltaInfo[i].KernelTime.QuadPart/(double)TotalCPUTime[i].QuadPart);  //Lint
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n");
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "User      %5.2f",
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      100.0*(double)DeltaInfo[MAXCPUS].UserTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.2f",
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      100.0*(double)DeltaInfo[i].UserTime.QuadPart/TotalCPUTime[i].QuadPart);  //Lint
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n");
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Dpc       %5.2f",
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      100.0*(double)DeltaInfo[MAXCPUS].DpcTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);  //Lint
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.2f",
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      100.0*(double)DeltaInfo[i].DpcTime.QuadPart/(double)TotalCPUTime[i].QuadPart);  //Lint
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n");
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Interrupt %5.2f",
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      100.0*(double)DeltaInfo[MAXCPUS].InterruptTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);  //Lint
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.2f",
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      100.0*(double)DeltaInfo[i].InterruptTime.QuadPart/TotalCPUTime[i].QuadPart);  //Lint
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n\n");
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Interrupt/Sec. %5.1f",
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (double)DeltaInfo[MAXCPUS].InterruptCount*10000.0/(double)duration);
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((int)SystemInfo.dwNumberOfProcessors > 1)
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(where, "\t %5.1f",
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (double)DeltaInfo[i].InterruptCount*10000.0/(double)duration);
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "\n\n");
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (tot_CPU_Util);
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}  /* ReportPerfCntrs */
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ClosePerfCntrs() -
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  This routine cleans up the performance counter APIs.
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project*/
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid ClosePerfCntrs(PerfObj *PerfCntrs)
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        GlobalFree(PerfCntrs);
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        NtQuerySystemInformation = NULL;
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}   /* ClosePerfCntrs */
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  RestartPerfCntrs(PerfCntrs);
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  RestartPerfCntrs(PerfCntrs);
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float correction_factor;
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)0.0;
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0 +
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where, "correction factor: %f\n", correction_factor);
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)ReportPerfCntrs(PerfCntrs);
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= correction_factor;
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
498