freebsd cpu metrics
This commit is contained in:
parent
ac37c62faa
commit
0f4850670f
|
@ -8,6 +8,7 @@
|
|||
#include <mach/message.h>
|
||||
#include <mach/kern_return.h>
|
||||
#else
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/user.h>
|
||||
|
@ -31,6 +32,43 @@
|
|||
|
||||
#define NMIB(mib) (sizeof(mib)/sizeof(mib[0]))
|
||||
|
||||
#ifndef DARWIN
|
||||
static int get_koffsets(sigar_t *sigar)
|
||||
{
|
||||
int i;
|
||||
struct nlist klist[] = {
|
||||
{ "_cp_time" },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
kvm_nlist(sigar->kp, klist);
|
||||
if (klist[0].n_type == 0) {
|
||||
return errno;
|
||||
}
|
||||
|
||||
for (i=0; i<KOFFSET_MAX; i++) {
|
||||
sigar->koffsets[i] = klist[i].n_value;
|
||||
}
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
||||
static int kread(sigar_t *sigar, void *data, int size, long offset)
|
||||
{
|
||||
#if 0
|
||||
if (sigar->kmem < 0) {
|
||||
return SIGAR_EPERM_KMEM;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (kvm_read(sigar->kp, offset, data, size) != size) {
|
||||
return errno;
|
||||
}
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
int sigar_os_open(sigar_t **sigar)
|
||||
{
|
||||
int mib[2];
|
||||
|
@ -60,6 +98,8 @@ int sigar_os_open(sigar_t **sigar)
|
|||
(*sigar)->kp = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open");
|
||||
#endif
|
||||
|
||||
get_koffsets(*sigar);
|
||||
|
||||
(*sigar)->ncpu = ncpu;
|
||||
|
||||
(*sigar)->boot_time = boottime.tv_sec; /* XXX seems off a bit */
|
||||
|
@ -239,12 +279,21 @@ int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
|||
cpu->total = cpu->user + cpu->nice + cpu->sys + cpu->idle;
|
||||
|
||||
#else
|
||||
/*XXX*/
|
||||
cpu->user = 0;
|
||||
cpu->nice = 0;
|
||||
cpu->sys = 0;
|
||||
cpu->idle = 0;
|
||||
cpu->wait = 0; /*N/A*/
|
||||
int status;
|
||||
long cp_time[CPUSTATES];
|
||||
|
||||
status = kread(sigar, &cp_time, sizeof(cp_time),
|
||||
sigar->koffsets[KOFFSET_CPUINFO]);
|
||||
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
cpu->user = cp_time[CP_USER];
|
||||
cpu->nice = cp_time[CP_NICE];
|
||||
cpu->sys = cp_time[CP_SYS];
|
||||
cpu->idle = cp_time[CP_IDLE];
|
||||
cpu->wait = cp_time[CP_INTR];
|
||||
cpu->total = cpu->user + cpu->nice + cpu->sys + cpu->idle;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -10,6 +10,11 @@
|
|||
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
enum {
|
||||
KOFFSET_CPUINFO,
|
||||
KOFFSET_MAX
|
||||
};
|
||||
|
||||
struct sigar_t {
|
||||
SIGAR_T_BASE;
|
||||
int pagesize;
|
||||
|
@ -20,6 +25,8 @@ struct sigar_t {
|
|||
mach_port_t mach_port;
|
||||
#else
|
||||
kvm_t *kp;
|
||||
/* offsets for seeking on kmem */
|
||||
unsigned long koffsets[KOFFSET_MAX];
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue