diff --git a/src/os/solaris/kstats.c b/src/os/solaris/kstats.c index 702a76b8..a38e51d0 100644 --- a/src/os/solaris/kstats.c +++ b/src/os/solaris/kstats.c @@ -59,6 +59,46 @@ int sigar_get_multi_kstats(sigar_t *sigar, 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) { 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.mempages = kstat_lookup(kc, "bunyip", -1, "mempages"); + /* reset offsets on kstat_chain_update */ + sigar_free_multi_kstats(sigar); + return SIGAR_OK; } diff --git a/src/os/solaris/sigar_os.h b/src/os/solaris/sigar_os.h index 6dcc22fb..92a1c259 100644 --- a/src/os/solaris/sigar_os.h +++ b/src/os/solaris/sigar_os.h @@ -59,6 +59,10 @@ SIGAR_INLINE kid_t sigar_kstat_update(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, kstat_list_t *kl, const char *name, diff --git a/src/os/solaris/solaris_sigar.c b/src/os/solaris/solaris_sigar.c index 790817df..49cdb4da 100644 --- a/src/os/solaris/solaris_sigar.c +++ b/src/os/solaris/solaris_sigar.c @@ -33,13 +33,6 @@ #include #include -#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) int sigar_os_open(sigar_t **sig) @@ -94,16 +87,12 @@ int sigar_os_open(sigar_t **sig) sigar->ks.cpuid = NULL; 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.mempages[0] = -1; sigar->koffsets.syspages[0] = -1; - + + sigar_init_multi_kstats(sigar); + if ((status = sigar_get_kstats(sigar)) != SIGAR_OK) { fprintf(stderr, "status=%d\n", status); } @@ -139,21 +128,8 @@ int sigar_os_close(sigar_t *sigar) { kstat_close(sigar->kc); - if (sigar->ks.lo.num) { - 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); - } + sigar_free_multi_kstats(sigar); + if (sigar->ks.lcpu) { free(sigar->ks.cpu); free(sigar->ks.cpu_info);