reset kstat offsets on kstat_chain_update

This commit is contained in:
Doug MacEachern 2007-08-11 00:22:59 +00:00
parent 1fb39c2148
commit 14f8285648
3 changed files with 52 additions and 29 deletions

View File

@ -59,6 +59,46 @@ int sigar_get_multi_kstats(sigar_t *sigar,
return SIGAR_OK; return SIGAR_OK;
} }
#define KSTAT_LIST_INIT(sigar, dev) \
sigar->koffsets.dev[0] = -1; \
sigar->ks.dev.num = 0; \
sigar->ks.dev.ks = NULL; \
sigar->ks.dev.name = #dev; \
sigar->ks.dev.nlen = sizeof(#dev)-1
void sigar_init_multi_kstats(sigar_t *sigar)
{
KSTAT_LIST_INIT(sigar, lo);
KSTAT_LIST_INIT(sigar, hme);
KSTAT_LIST_INIT(sigar, dmfe);
KSTAT_LIST_INIT(sigar, ge);
KSTAT_LIST_INIT(sigar, eri);
}
void sigar_free_multi_kstats(sigar_t *sigar)
{
if (sigar->ks.lo.num) {
free(sigar->ks.lo.ks);
KSTAT_LIST_INIT(sigar, lo);
}
if (sigar->ks.hme.num) {
free(sigar->ks.hme.ks);
KSTAT_LIST_INIT(sigar, hme);
}
if (sigar->ks.dmfe.num) {
free(sigar->ks.dmfe.ks);
KSTAT_LIST_INIT(sigar, dmfe);
}
if (sigar->ks.ge.num) {
free(sigar->ks.ge.ks);
KSTAT_LIST_INIT(sigar, ge);
}
if (sigar->ks.eri.num) {
free(sigar->ks.eri.ks);
KSTAT_LIST_INIT(sigar, eri);
}
}
int sigar_get_kstats(sigar_t *sigar) int sigar_get_kstats(sigar_t *sigar)
{ {
kstat_ctl_t *kc = sigar->kc; kstat_ctl_t *kc = sigar->kc;
@ -129,6 +169,9 @@ int sigar_get_kstats(sigar_t *sigar)
sigar->ks.syspages = kstat_lookup(kc, "unix", -1, "system_pages"); sigar->ks.syspages = kstat_lookup(kc, "unix", -1, "system_pages");
sigar->ks.mempages = kstat_lookup(kc, "bunyip", -1, "mempages"); sigar->ks.mempages = kstat_lookup(kc, "bunyip", -1, "mempages");
/* reset offsets on kstat_chain_update */
sigar_free_multi_kstats(sigar);
return SIGAR_OK; return SIGAR_OK;
} }

View File

@ -59,6 +59,10 @@ SIGAR_INLINE kid_t sigar_kstat_update(sigar_t *sigar);
int sigar_get_kstats(sigar_t *sigar); int sigar_get_kstats(sigar_t *sigar);
void sigar_init_multi_kstats(sigar_t *sigar);
void sigar_free_multi_kstats(sigar_t *sigar);
int sigar_get_multi_kstats(sigar_t *sigar, int sigar_get_multi_kstats(sigar_t *sigar,
kstat_list_t *kl, kstat_list_t *kl,
const char *name, const char *name,

View File

@ -33,13 +33,6 @@
#include <sys/utsname.h> #include <sys/utsname.h>
#include <dlfcn.h> #include <dlfcn.h>
#define KSTAT_LIST_INIT(sigar, dev) \
sigar->koffsets.dev[0] = -1; \
sigar->ks.dev.num = 0; \
sigar->ks.dev.ks = NULL; \
sigar->ks.dev.name = #dev; \
sigar->ks.dev.nlen = strlen(#dev)
#define PROC_ERRNO ((errno == ENOENT) ? ESRCH : errno) #define PROC_ERRNO ((errno == ENOENT) ? ESRCH : errno)
int sigar_os_open(sigar_t **sig) int sigar_os_open(sigar_t **sig)
@ -94,16 +87,12 @@ int sigar_os_open(sigar_t **sig)
sigar->ks.cpuid = NULL; sigar->ks.cpuid = NULL;
sigar->ks.lcpu = 0; sigar->ks.lcpu = 0;
KSTAT_LIST_INIT(sigar, lo);
KSTAT_LIST_INIT(sigar, hme);
KSTAT_LIST_INIT(sigar, dmfe);
KSTAT_LIST_INIT(sigar, ge);
KSTAT_LIST_INIT(sigar, eri);
sigar->koffsets.system[0] = -1; sigar->koffsets.system[0] = -1;
sigar->koffsets.mempages[0] = -1; sigar->koffsets.mempages[0] = -1;
sigar->koffsets.syspages[0] = -1; sigar->koffsets.syspages[0] = -1;
sigar_init_multi_kstats(sigar);
if ((status = sigar_get_kstats(sigar)) != SIGAR_OK) { if ((status = sigar_get_kstats(sigar)) != SIGAR_OK) {
fprintf(stderr, "status=%d\n", status); fprintf(stderr, "status=%d\n", status);
} }
@ -139,21 +128,8 @@ int sigar_os_close(sigar_t *sigar)
{ {
kstat_close(sigar->kc); kstat_close(sigar->kc);
if (sigar->ks.lo.num) { sigar_free_multi_kstats(sigar);
free(sigar->ks.lo.ks);
}
if (sigar->ks.hme.num) {
free(sigar->ks.hme.ks);
}
if (sigar->ks.dmfe.num) {
free(sigar->ks.dmfe.ks);
}
if (sigar->ks.ge.num) {
free(sigar->ks.ge.ks);
}
if (sigar->ks.eri.num) {
free(sigar->ks.eri.ks);
}
if (sigar->ks.lcpu) { if (sigar->ks.lcpu) {
free(sigar->ks.cpu); free(sigar->ks.cpu);
free(sigar->ks.cpu_info); free(sigar->ks.cpu_info);