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