dockapps/wmcpuload/src/cpu_solaris.c
2012-02-12 22:50:31 +00:00

116 lines
2.4 KiB
C

/*
* cpu_solaric.c - module to get cpu usage, for Solaris
*
* Copyright (C) 2001 Jonathan Lang <lang@synopsys.com>
* Copyright (C) 2002 Seiichi SATO <ssato@sh.rim.or.jp>
*
* licensed under the GPL
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "cpu.h"
#include <kstat.h>
#include <sys/cpuvar.h>
#include <sys/sysinfo.h>
kstat_t **cpu_ks;
cpu_stat_t *cpu_stat;
void
cpu_init(void)
{
/* You don't need initialization under solaris */
return;
}
/* returns current CPU usage in percent */
int
cpu_get_usage(cpu_options *opts)
{
static long oldload, oldtotal;
long cpuload, cputotal;
int result, ncpus, i;
kstat_ctl_t *kc;
kstat_named_t *kn;
kstat_t *ks;
kc = kstat_open();
if (!kc) {
perror("kstat_open");
exit(1);
}
ks = kstat_lookup(kc, "unix", 0, "system_misc");
if (kstat_read(kc, ks, NULL) == -1) {
perror("kstat_read");
exit(1);
}
/*
* Find out how many CPUs the machine has
*/
kn = kstat_data_lookup(ks, "ncpus");
ncpus = kn->value.ul;
/*
* Get CPU usage stats.
*/
cpu_ks = (kstat_t **) realloc(cpu_ks, ncpus * sizeof(kstat_t *));
cpu_stat =
(cpu_stat_t *) realloc(cpu_stat, ncpus * sizeof(cpu_stat_t));
for (i = 0, ks = kc->kc_chain; ks; ks = ks->ks_next) {
if (strncmp(ks->ks_name, "cpu_stat", 8) == 0)
cpu_ks[i++] = ks;
}
for (i = 0; i < ncpus; ++i)
(void) kstat_read(kc, cpu_ks[i], &cpu_stat[i]);
/*
* Sum the times for the various non-idle CPU_STATES, for Solaris the
* CPU_STATES are:
*
* CPU_IDLE 0
* CPU_USER 1
* CPU_KERNEL 2
* CPU_WAIT 3
*/
for (cpuload = 0, i = 0; i < ncpus; ++i) {
cpuload += (long) cpu_stat[i].cpu_sysinfo.cpu[CPU_USER];
cpuload += (long) cpu_stat[i].cpu_sysinfo.cpu[CPU_KERNEL];
cpuload += (long) cpu_stat[i].cpu_sysinfo.cpu[CPU_WAIT];
}
/*
* Total Time
*/
for (cputotal = cpuload, i = 0; i < ncpus; ++i)
cputotal += (long) cpu_stat[i].cpu_sysinfo.cpu[CPU_IDLE];
kstat_close(kc);
if (oldtotal == 0) {
result = 0;
} else if ((cputotal - oldtotal) > 0) {
result = (100 * (double) (cpuload - oldload)) /
(double) (cputotal - oldtotal);
} else if (cputotal == oldtotal) {
result = 0;
} else
result = 0;
oldload = cpuload;
oldtotal = cputotal;
return result;
}