102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_pstat_id[]="\
27cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes@(#)netcpu_pstat.c (c) Copyright 2005-2012, Hewlett-Packard Company, Version 2.6.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>
207cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes#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
417cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughescpu_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
587cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughesstatic void
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;
677cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
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
1057cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  float
1067cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes    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
1117cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  long
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sec,
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec;
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1157cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  int
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    i,
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    j;
1187cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
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;
1257cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (iterations > MAXTIMES) {
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    iterations = MAXTIMES;
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1297cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
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);
1617cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
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        }
1987cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes        temp_rate = (secondcnt[j] >= firstcnt[j]) ?
1997cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes          (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
2317cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  memset(&lib_local_cpu_stats, 0, sizeof(lib_local_cpu_stats));
2327cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
2387cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
2407cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes    correction_factor = (float) 1.0 +
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this looks just like the looper case. at least I think it */
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* should :) raj 4/95 */
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++) {
2507cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we assume that the two are not more than a long apart. I */
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* know that this is bad, but trying to go from long longs to */
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a float (perhaps a double) is boggling my mind right now. */
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 4/95 */
2557cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
2567cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes    long long
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff;
2587cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lib_end_count[i] >= lib_start_count[i]) {
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff = lib_end_count[i] - lib_start_count[i];
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff = lib_end_count[i] - lib_start_count[i] + LONG_LONG_MAX;
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    actual_rate = (float) diff / lib_elapsed;
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_maxrate * 100;
2687cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes    lib_local_per_cpu_util[i] *= correction_factor;
2697cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes    lib_local_cpu_stats.cpu_util += lib_local_per_cpu_util[i];
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
2727cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes	      "calc_cpu_util: actual_rate on cpu %d is %g max_rate %g cpu %6.2f cf %f\n",
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      i,
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      actual_rate,
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lib_local_maxrate,
2767cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes	      lib_local_per_cpu_util[i],
2777cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes	      correction_factor);
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2817cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  /* we want the average across all n processors */
2827cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  lib_local_cpu_stats.cpu_util /= (float)lib_num_loc_cpus;
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
2867cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes	    "calc_cpu_util: average across CPUs is %g\n",
2877cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes            lib_local_cpu_stats.cpu_util);
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2907cb62816f02cc6abb1fe88b94808fc412e0b29d0Elliott Hughes  return lib_local_cpu_stats.cpu_util;
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_start_count);
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_end_count);
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
305