102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_sysctl_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_sysctl.c  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#include <unistd.h>
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h>
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdint.h>
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if TIME_WITH_SYS_TIME
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h>
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h>
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_SYS_TIME_H
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <sys/time.h>
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# else
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <time.h>
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_LIMITS_H
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <limits.h>
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# ifndef LONG_LONG_MAX
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  define LONG_LONG_MAX LLONG_MAX
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif /* LONG_LONG_MAX */
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* need to have some sort of check for sys/sysctl.h versus sysctl.h */
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/sysctl.h>
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this has been liberally cut and pasted from <sys/resource.h> on
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   FreeBSD. in general, this would be a bad idea, but I don't want to
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   have to do a _KERNEL define to get these and that is what
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   sys/resource.h seems to want. raj 2002-03-03 */
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CP_USER         0
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CP_NICE         1
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CP_SYS          2
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CP_INTR         3
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CP_IDLE         4
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CPUSTATES       5
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic long lib_start_count[CPUSTATES];
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic long lib_end_count[CPUSTATES];
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void)
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void)
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return SYSCTL;
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_time(long *cpu_time)
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  size_t cpu_time_len = CPUSTATES * sizeof (cpu_time[0]);
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sysctlbyname("kern.cp_time", cpu_time, &cpu_time_len, NULL, 0) == -1) {
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf (stderr, "Cannot get CPU time!\n");
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit (1);
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* calibrate_sysctl  - perform the idle rate calculation using the
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   sysctl call - typically on BSD */
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval)
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return sysconf (_SC_CLK_TCK);
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  long sum_idle, sum_busy;
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (sum_busy = 0, i = 0; i < CPUSTATES; i++) {
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (i != CP_IDLE)
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sum_busy += lib_end_count[i] - lib_start_count[i];
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_idle = lib_end_count[CP_IDLE] - lib_start_count[CP_IDLE];
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)sum_busy / (float)(sum_busy + sum_idle);
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= 100.0;
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_time(lib_start_count);
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_time(lib_end_count);
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
128