102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_procstat_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_procstat.c (c) Copyright 2005-2007 Version 2.4.3";
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* netcpu_procstat.c
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   Implement the /proc/stat specific portions of netperf CPU
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   utilization measurements. These are broken-out into a separate file
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   to make life much nicer over in netlib.c which had become a maze of
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   twisty, CPU-util-related, #ifdefs, all different.  raj 2005-01-26
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_FCNTL_H
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <fcntl.h>
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_UNISTD_H
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <unistd.h>
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if STDC_HEADERS
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdlib.h>
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stddef.h>
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDLIB_H
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdlib.h>
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the lib_start_count and lib_end_count arrays hold the starting
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   and ending values of whatever is counting when the system is
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   idle. The rate at which this increments during a test is compared
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   with a previous calibrarion to arrive at a CPU utilization
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   percentage. raj 2005-01-26 */
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_start_count[MAXCPUS];
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_end_count[MAXCPUS];
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* The max. length of one line of /proc/stat cpu output */
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CPU_LINE_LENGTH ((8 * sizeof (long) / 3 + 1) * 4 + 8)
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PROC_STAT_FILE_NAME "/proc/stat"
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define N_CPU_LINES(nr) (nr == 1 ? 1 : 1 + nr)
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int proc_stat_fd = -1;
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic char *proc_stat_buf = NULL;
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int proc_stat_buflen = 0;
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "cpu_util_init enter, proc_stat_fd %d proc_stat_buf %p\n",
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    proc_stat_fd,
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    proc_stat_buf);
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (proc_stat_fd < 0) {
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (proc_stat_fd < 0) {
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf (stderr, "Cannot open %s!\n", PROC_STAT_FILE_NAME);
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit (1);
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!proc_stat_buf) {
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %d\n",
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lib_num_loc_cpus,
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      N_CPU_LINES(lib_num_loc_cpus),
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      CPU_LINE_LENGTH,
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      proc_stat_buflen);
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_buf = (char *)malloc (proc_stat_buflen);
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!proc_stat_buf) {
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf (stderr, "Cannot allocate buffer memory!\n");
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit (1);
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void)
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(proc_stat_fd);
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  proc_stat_fd = -1;
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  free(proc_stat_buf);
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  proc_stat_buf = NULL;
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method()
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return PROC_STAT;
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate (int iterations, int interval)
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (proc_stat_fd < 0) {
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (proc_stat_fd < 0) {
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf (stderr, "Cannot open %s!\n", PROC_STAT_FILE_NAME);
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit (1);
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!proc_stat_buf) {
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "calibrate: lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %d\n",
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lib_num_loc_cpus,
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      N_CPU_LINES(lib_num_loc_cpus),
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      CPU_LINE_LENGTH,
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      proc_stat_buflen);
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    proc_stat_buf = (char *)malloc (proc_stat_buflen);
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!proc_stat_buf) {
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf (stderr, "Cannot allocate buffer memory!\n");
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit (1);
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return sysconf (_SC_CLK_TCK);
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle (uint64_t *res)
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int space;
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int n = lib_num_loc_cpus;
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *p = proc_stat_buf;
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lseek (proc_stat_fd, 0, SEEK_SET);
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  read (proc_stat_fd, p, proc_stat_buflen);
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"proc_stat_buf '%.*s'\n",proc_stat_buflen,p);
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Skip first line (total) on SMP */
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (n > 1) p = strchr (p, '\n');
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Idle time is the 4th space-separated token */
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < n; i++) {
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (space = 0; space < 4; space ++) {
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      p = strchr (p, ' ');
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while (*++p == ' ');
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    res[i] = strtoul (p, &p, 10);
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"res[%d] is %llu\n",i,res[i]);
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    p = strchr (p, '\n');
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* take the initial timestamp and start collecting CPU utilization if
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   requested */
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectmeasure_cpu_start()
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_method = PROC_STAT;
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_start_count);
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* collect final CPU utilization raw data */
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectmeasure_cpu_stop()
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_end_count);
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float actual_rate;
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float correction_factor;
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)0.0;
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0 +
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++) {
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would appear that on some systems, in loopback, nice is
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     *very* effective, causing the looper process to stop dead in its
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     tracks. if this happens, we need to ensure that the calculation
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     does not go south. raj 6/95 and if we run completely out of idle,
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the same thing could in theory happen to the USE_KSTAT path. raj
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     8/2000 */
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lib_end_count[i] == lib_start_count[i]) {
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_end_count[i]++;
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (float)(lib_end_count[i] - lib_start_count[i] +
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      MAXLONG)/ lib_elapsed;
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_maxrate * 100;
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "calc_cpu_util: actual_rate on processor %d is %f start %llx end %llx util %f\n",
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              i,
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              actual_rate,
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_start_count[i],
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_end_count[i],
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lib_local_per_cpu_util[i]);
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_cpu_util += lib_local_per_cpu_util[i];
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want the average across all n processors */
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util /= (float)lib_num_loc_cpus;
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= correction_factor;
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_start_count);
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_end_count);
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
266