freebsd cpu metrics
This commit is contained in:
parent
ac37c62faa
commit
0f4850670f
|
@ -8,6 +8,7 @@
|
||||||
#include <mach/message.h>
|
#include <mach/message.h>
|
||||||
#include <mach/kern_return.h>
|
#include <mach/kern_return.h>
|
||||||
#else
|
#else
|
||||||
|
#include <sys/dkstat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
|
@ -31,6 +32,43 @@
|
||||||
|
|
||||||
#define NMIB(mib) (sizeof(mib)/sizeof(mib[0]))
|
#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 sigar_os_open(sigar_t **sigar)
|
||||||
{
|
{
|
||||||
int mib[2];
|
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");
|
(*sigar)->kp = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
get_koffsets(*sigar);
|
||||||
|
|
||||||
(*sigar)->ncpu = ncpu;
|
(*sigar)->ncpu = ncpu;
|
||||||
|
|
||||||
(*sigar)->boot_time = boottime.tv_sec; /* XXX seems off a bit */
|
(*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;
|
cpu->total = cpu->user + cpu->nice + cpu->sys + cpu->idle;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/*XXX*/
|
int status;
|
||||||
cpu->user = 0;
|
long cp_time[CPUSTATES];
|
||||||
cpu->nice = 0;
|
|
||||||
cpu->sys = 0;
|
status = kread(sigar, &cp_time, sizeof(cp_time),
|
||||||
cpu->idle = 0;
|
sigar->koffsets[KOFFSET_CPUINFO]);
|
||||||
cpu->wait = 0; /*N/A*/
|
|
||||||
|
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;
|
cpu->total = cpu->user + cpu->nice + cpu->sys + cpu->idle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,11 @@
|
||||||
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
KOFFSET_CPUINFO,
|
||||||
|
KOFFSET_MAX
|
||||||
|
};
|
||||||
|
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
SIGAR_T_BASE;
|
SIGAR_T_BASE;
|
||||||
int pagesize;
|
int pagesize;
|
||||||
|
@ -20,6 +25,8 @@ struct sigar_t {
|
||||||
mach_port_t mach_port;
|
mach_port_t mach_port;
|
||||||
#else
|
#else
|
||||||
kvm_t *kp;
|
kvm_t *kp;
|
||||||
|
/* offsets for seeking on kmem */
|
||||||
|
unsigned long koffsets[KOFFSET_MAX];
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue