• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 char   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 
58 static long lib_start_count[CPUSTATES];
59 static long lib_end_count[CPUSTATES];
60 
61 void
cpu_util_init(void)62 cpu_util_init(void)
63 {
64   return;
65 }
66 
67 void
cpu_util_terminate(void)68 cpu_util_terminate(void)
69 {
70   return;
71 }
72 
73 int
get_cpu_method(void)74 get_cpu_method(void)
75 {
76   return SYSCTL;
77 }
78 
79 static void
get_cpu_time(long * cpu_time)80 get_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 
93 float
calibrate_idle_rate(int iterations,int interval)94 calibrate_idle_rate(int iterations, int interval)
95 {
96   return sysconf (_SC_CLK_TCK);
97 }
98 
99 float
calc_cpu_util_internal(float elapsed_time)100 calc_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 }
117 void
cpu_start_internal(void)118 cpu_start_internal(void)
119 {
120   get_cpu_time(lib_start_count);
121 }
122 
123 void
cpu_stop_internal(void)124 cpu_stop_internal(void)
125 {
126   get_cpu_time(lib_end_count);
127 }
128