netcpu_pstat.c revision 02fb0aca1189a2c1fd20806c588e9ee80d9755f8
102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar netcpu_pstat_id[]="\ 202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_pstat.c (c) Copyright 2005, Hewlett-Packard Company, Version 2.4.0"; 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 HAVE_LIMITS_H 1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <limits.h> 2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dk.h> 2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/pstat.h> 2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef PSTAT_IPCINFO 2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# error Sorry, pstat() CPU utilization on 10.0 and later only 2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h" 3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h" 3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the lib_start_count and lib_end_count arrays hold the starting 3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project and ending values of whatever is counting when the system is 3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project idle. The rate at which this increments during a test is compared 3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project with a previous calibrarion to arrive at a CPU utilization 3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project percentage. raj 2005-01-26 */ 3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t lib_start_count[MAXCPUS]; 3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t lib_end_count[MAXCPUS]; 3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void) 4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void) 4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint 5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void) 5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return HP_IDLE_COUNTER; 5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle(uint64_t *res) 6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* get the idle sycle counter for each processor */ 6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project struct pst_processor *psp; 6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project union overlay_u { 6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long long full; 6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long word[2]; 6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } *overlay; 6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project psp = (struct pst_processor *)malloc(lib_num_loc_cpus * sizeof(*psp)); 6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (psp == NULL) { 7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project printf("malloc(%d) failed!\n", lib_num_loc_cpus * sizeof(*psp)); 7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(1); 7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) { 7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = 0; i < lib_num_loc_cpus; i++) { 7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay = (union overlay_u *)&(res[i]); 7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[0] = psp[i].psp_idlecycles.psc_hi; 7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[1] = psp[i].psp_idlecycles.psc_lo; 7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if(debug) { 8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\tres[%d] = 0x%8.8x%8.8x\n", 8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i, 8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project hi_32(&res[i]), 8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lo_32(&res[i])); 8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project free(psp); 8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* calibrate_pstat 9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Loop a number of iterations, sleeping wait_time seconds each and 9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project count how high the idle counter gets each time. Return the measured 9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project cpu rate to the calling routine. */ 9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval) 9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t 10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project firstcnt[MAXCPUS], 10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project secondcnt[MAXCPUS]; 10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float 10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project elapsed, 10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project temp_rate, 10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project rate[MAXTIMES], 10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project local_maxrate; 11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long 11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project sec, 11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project usec; 11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int 11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i, 11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project j; 11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long count; 12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project struct timeval time1, time2; 12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project struct timezone tz; 12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project struct pst_processor *psp; 12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (iterations > MAXTIMES) { 12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project iterations = MAXTIMES; 12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project local_maxrate = -1.0; 13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project psp = (struct pst_processor *)malloc(lib_num_loc_cpus * sizeof(*psp)); 13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (psp == NULL) { 13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project printf("malloc(%d) failed!\n", lib_num_loc_cpus * sizeof(*psp)); 13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(1); 13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for(i = 0; i < iterations; i++) { 13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project rate[i] = 0.0; 14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* get the idle sycle counter for each processor */ 14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) { 14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (j = 0; j < lib_num_loc_cpus; j++) { 14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project union overlay_u { 14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long long full; 14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long word[2]; 14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } *overlay; 14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay = (union overlay_u *)&(firstcnt[j]); 14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[0] = psp[j].psp_idlecycles.psc_hi; 14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[1] = psp[j].psp_idlecycles.psc_lo; 15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"pstat_getprocessor failure errno %d\n",errno); 15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(1); 15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project gettimeofday (&time1, &tz); 15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project sleep(interval); 16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project gettimeofday (&time2, &tz); 16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (time2.tv_usec < time1.tv_usec) 16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project { 16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project time2.tv_usec += 1000000; 16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project time2.tv_sec -=1; 16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project sec = time2.tv_sec - time1.tv_sec; 16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project usec = time2.tv_usec - time1.tv_usec; 16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project elapsed = (float)sec + ((float)usec/(float)1000000.0); 17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if(debug) { 17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, "Calibration for counter run: %d\n",i); 17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec); 17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\telapsed time = %g\n",elapsed); 17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) { 17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (j = 0; j < lib_num_loc_cpus; j++) { 17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project union overlay_u { 18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long long full; 18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long word[2]; 18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } *overlay; 18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay = (union overlay_u *)&(secondcnt[j]); 18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[0] = psp[j].psp_idlecycles.psc_hi; 18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project overlay->word[1] = psp[j].psp_idlecycles.psc_lo; 18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if(debug) { 18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* I know that there are situations where compilers know about */ 18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* long long, but the library fucntions do not... raj 4/95 */ 18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\tfirstcnt[%d] = 0x%8.8x%8.8x secondcnt[%d] = 0x%8.8x%8.8x\n", 19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project j, 19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project hi_32(&firstcnt[j]), 19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lo_32(&firstcnt[j]), 19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project j, 19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project hi_32(&secondcnt[j]), 19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lo_32(&secondcnt[j])); 19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project temp_rate = (secondcnt[j] >= firstcnt[j]) ? 19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (float)(secondcnt[j] - firstcnt[j] )/elapsed : 20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (float)(secondcnt[j] - firstcnt[j] + LONG_LONG_MAX)/elapsed; 20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (temp_rate > rate[i]) rate[i] = temp_rate; 20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if(debug) { 20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\trate[%d] = %g\n",i,rate[i]); 20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (local_maxrate < rate[i]) local_maxrate = rate[i]; 20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"pstat failure; errno %d\n",errno); 21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(1); 21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if(debug) { 21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate); 21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return local_maxrate; 22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time) 22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float actual_rate; 22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float correction_factor; 23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util = (float)0.0; 23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* It is possible that the library measured a time other than */ 23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the one that the user want for the cpu utilization */ 23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* calculations - for example, tests that were ended by */ 23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* watchdog timers such as the udp stream test. We let these */ 23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* tests tell up what the elapsed time should be. */ 23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (elapsed_time != 0.0) { 23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0 + 24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project ((lib_elapsed - elapsed_time) / elapsed_time); 24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0; 24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this looks just like the looper case. at least I think it */ 24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* should :) raj 4/95 */ 24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = 0; i < lib_num_loc_cpus; i++) { 24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we assume that the two are not more than a long apart. I */ 25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* know that this is bad, but trying to go from long longs to */ 25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* a float (perhaps a double) is boggling my mind right now. */ 25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* raj 4/95 */ 25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project long long 25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project diff; 25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (lib_end_count[i] >= lib_start_count[i]) { 25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project diff = lib_end_count[i] - lib_start_count[i]; 26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project diff = lib_end_count[i] - lib_start_count[i] + LONG_LONG_MAX; 26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project actual_rate = (float) diff / lib_elapsed; 26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) / 26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_maxrate * 100; 26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util += lib_local_per_cpu_util[i]; 26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "calc_cpu_util: actual_rate on cpu %d is %g max_rate %g cpu %6.2f\n", 27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i, 27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project actual_rate, 27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_maxrate, 27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_per_cpu_util[i]); 27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we want the average across all n processors */ 27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util /= (float)lib_num_loc_cpus; 28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "calc_cpu_util: average across CPUs is %g\n",lib_local_cpu_util); 28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util *= correction_factor; 28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "calc_cpu_util: returning %g\n",lib_local_cpu_util); 29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return lib_local_cpu_util; 29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void) 29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_cpu_idle(lib_start_count); 30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void) 30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_cpu_idle(lib_end_count); 30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 308