1char netcpu_sysctl_id[]="\ 2@(#)netcpu_sysctl.c Version 2.4.3"; 3 4#if HAVE_CONFIG_H 5# include <config.h> 6#endif 7 8#include <stdio.h> 9#include <unistd.h> 10 11#if HAVE_INTTYPES_H 12# include <inttypes.h> 13#else 14# if HAVE_STDINT_H 15# include <stdint.h> 16# endif 17#endif 18 19#if TIME_WITH_SYS_TIME 20# include <sys/time.h> 21# include <time.h> 22#else 23# if HAVE_SYS_TIME_H 24# include <sys/time.h> 25# else 26# include <time.h> 27# endif 28#endif 29#if HAVE_LIMITS_H 30# include <limits.h> 31# ifndef LONG_LONG_MAX 32# define LONG_LONG_MAX LLONG_MAX 33# endif /* LONG_LONG_MAX */ 34#endif 35 36 37#include <errno.h> 38 39/* need to have some sort of check for sys/sysctl.h versus sysctl.h */ 40#include <sys/sysctl.h> 41 42 43/* this has been liberally cut and pasted from <sys/resource.h> on 44 FreeBSD. in general, this would be a bad idea, but I don't want to 45 have to do a _KERNEL define to get these and that is what 46 sys/resource.h seems to want. raj 2002-03-03 */ 47#define CP_USER 0 48#define CP_NICE 1 49#define CP_SYS 2 50#define CP_INTR 3 51#define CP_IDLE 4 52#define CPUSTATES 5 53 54 55#include "netsh.h" 56#include "netlib.h" 57 58static long lib_start_count[CPUSTATES]; 59static long lib_end_count[CPUSTATES]; 60 61void 62cpu_util_init(void) 63{ 64 return; 65} 66 67void 68cpu_util_terminate(void) 69{ 70 return; 71} 72 73int 74get_cpu_method(void) 75{ 76 return SYSCTL; 77} 78 79static void 80get_cpu_time(long *cpu_time) 81{ 82 size_t cpu_time_len = CPUSTATES * sizeof (cpu_time[0]); 83 84 if (sysctlbyname("kern.cp_time", cpu_time, &cpu_time_len, NULL, 0) == -1) { 85 fprintf (stderr, "Cannot get CPU time!\n"); 86 exit (1); 87 } 88} 89 90/* calibrate_sysctl - perform the idle rate calculation using the 91 sysctl call - typically on BSD */ 92 93float 94calibrate_idle_rate(int iterations, int interval) 95{ 96 return sysconf (_SC_CLK_TCK); 97} 98 99float 100calc_cpu_util_internal(float elapsed_time) 101{ 102 long sum_idle, sum_busy; 103 int i; 104 105 for (sum_busy = 0, i = 0; i < CPUSTATES; i++) { 106 if (i != CP_IDLE) 107 sum_busy += lib_end_count[i] - lib_start_count[i]; 108 } 109 110 sum_idle = lib_end_count[CP_IDLE] - lib_start_count[CP_IDLE]; 111 lib_local_cpu_util = (float)sum_busy / (float)(sum_busy + sum_idle); 112 lib_local_cpu_util *= 100.0; 113 114 return lib_local_cpu_util; 115 116} 117void 118cpu_start_internal(void) 119{ 120 get_cpu_time(lib_start_count); 121} 122 123void 124cpu_stop_internal(void) 125{ 126 get_cpu_time(lib_end_count); 127} 128