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