aix thread_cpu_get impl
This commit is contained in:
parent
ebb4e703c8
commit
bee745af0d
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <nlist.h>
|
#include <nlist.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <utmp.h>
|
#include <utmp.h>
|
||||||
|
|
||||||
|
@ -39,6 +40,12 @@
|
||||||
#define SBITS 16
|
#define SBITS 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef PTHRDSINFO_RUSAGE_START
|
||||||
|
#define PTHRDSINFO_RUSAGE_START 0x00000001
|
||||||
|
#define PTHRDSINFO_RUSAGE_STOP 0x00000002
|
||||||
|
#define PTHRDSINFO_RUSAGE_COLLECT 0x00000004
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* from libperfstat.h:
|
* from libperfstat.h:
|
||||||
* "To calculate the load average, divide the numbers by (1<<SBITS).
|
* "To calculate the load average, divide the numbers by (1<<SBITS).
|
||||||
|
@ -144,6 +151,8 @@ int sigar_os_open(sigar_t **sigar)
|
||||||
|
|
||||||
(*sigar)->aix_version = atoi(name.version);
|
(*sigar)->aix_version = atoi(name.version);
|
||||||
|
|
||||||
|
(*sigar)->thrusage = PTHRDSINFO_RUSAGE_STOP;
|
||||||
|
|
||||||
(*sigar)->diskmap = NULL;
|
(*sigar)->diskmap = NULL;
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
|
@ -169,6 +178,11 @@ int sigar_os_close(sigar_t *sigar)
|
||||||
if (sigar->diskmap) {
|
if (sigar->diskmap) {
|
||||||
sigar_cache_destroy(sigar->diskmap);
|
sigar_cache_destroy(sigar->diskmap);
|
||||||
}
|
}
|
||||||
|
if (sigar->thrusage == PTHRDSINFO_RUSAGE_START) {
|
||||||
|
struct rusage usage;
|
||||||
|
sigar->perfstat.thread_rusage(&usage,
|
||||||
|
PTHRDSINFO_RUSAGE_STOP);
|
||||||
|
}
|
||||||
free(sigar);
|
free(sigar);
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
@ -268,6 +282,18 @@ static int sigar_perfstat_init(sigar_t *sigar)
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigar->perfstat.thread_rusage =
|
||||||
|
(thread_rusage_func_t)dlsym(handle,
|
||||||
|
"sigar_thread_rusage");
|
||||||
|
|
||||||
|
if (!sigar->perfstat.thread_rusage) {
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"dlsym(sigar_thread_rusage) failed: %s",
|
||||||
|
dlerror());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sigar->perfstat.cpu_total =
|
sigar->perfstat.cpu_total =
|
||||||
(perfstat_cpu_total_func_t)dlsym(handle,
|
(perfstat_cpu_total_func_t)dlsym(handle,
|
||||||
"sigar_perfstat_cpu_total");
|
"sigar_perfstat_cpu_total");
|
||||||
|
@ -1237,13 +1263,48 @@ int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SIGAR_MICROSEC2NANO(s) \
|
||||||
|
((sigar_uint64_t)(s) * (sigar_uint64_t)1000)
|
||||||
|
|
||||||
|
#define TIME_NSEC(t) \
|
||||||
|
(SIGAR_SEC2NANO((t).tv_sec) + SIGAR_MICROSEC2NANO((t).tv_usec))
|
||||||
|
|
||||||
int sigar_thread_cpu_get(sigar_t *sigar,
|
int sigar_thread_cpu_get(sigar_t *sigar,
|
||||||
sigar_uint64_t id,
|
sigar_uint64_t id,
|
||||||
sigar_thread_cpu_t *cpu)
|
sigar_thread_cpu_t *cpu)
|
||||||
{
|
{
|
||||||
|
struct rusage usage;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
sigar_perfstat_init(sigar);
|
||||||
|
if (!sigar->perfstat.thread_rusage) {
|
||||||
return SIGAR_ENOTIMPL;
|
return SIGAR_ENOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sigar->thrusage != PTHRDSINFO_RUSAGE_START) {
|
||||||
|
sigar->thrusage = PTHRDSINFO_RUSAGE_START;
|
||||||
|
retval =
|
||||||
|
sigar->perfstat.thread_rusage(&usage,
|
||||||
|
PTHRDSINFO_RUSAGE_START);
|
||||||
|
if (retval != 0) {
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retval =
|
||||||
|
sigar->perfstat.thread_rusage(&usage,
|
||||||
|
PTHRDSINFO_RUSAGE_COLLECT);
|
||||||
|
if (retval != 0) {
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu->user = TIME_NSEC(usage.ru_utime);
|
||||||
|
cpu->sys = TIME_NSEC(usage.ru_stime);
|
||||||
|
cpu->total = TIME_NSEC(usage.ru_utime) + TIME_NSEC(usage.ru_stime);
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int sigar_os_fs_type_get(sigar_file_system_t *fsp)
|
int sigar_os_fs_type_get(sigar_file_system_t *fsp)
|
||||||
{
|
{
|
||||||
return fsp->type;
|
return fsp->type;
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <procinfo.h>
|
#include <procinfo.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
#include "libperfstat.h"
|
#include "libperfstat.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -37,6 +39,8 @@ typedef int (*perfstat_swap_func_t)(perfstat_id_t *,
|
||||||
perfstat_pagingspace_t *,
|
perfstat_pagingspace_t *,
|
||||||
size_t, int);
|
size_t, int);
|
||||||
|
|
||||||
|
typedef int (*thread_rusage_func_t)(struct rusage *, int);
|
||||||
|
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
SIGAR_T_BASE;
|
SIGAR_T_BASE;
|
||||||
int kmem;
|
int kmem;
|
||||||
|
@ -49,6 +53,7 @@ struct sigar_t {
|
||||||
perfstat_cpu_func_t cpu;
|
perfstat_cpu_func_t cpu;
|
||||||
perfstat_cpu_total_func_t cpu_total;
|
perfstat_cpu_total_func_t cpu_total;
|
||||||
perfstat_swap_func_t swap;
|
perfstat_swap_func_t swap;
|
||||||
|
thread_rusage_func_t thread_rusage;
|
||||||
void *handle;
|
void *handle;
|
||||||
} perfstat;
|
} perfstat;
|
||||||
int pagesize;
|
int pagesize;
|
||||||
|
@ -62,6 +67,7 @@ struct sigar_t {
|
||||||
char model[128];
|
char model[128];
|
||||||
char self_path[SIGAR_PATH_MAX]; /* path to where libsigar.so lives */
|
char self_path[SIGAR_PATH_MAX]; /* path to where libsigar.so lives */
|
||||||
int aix_version;
|
int aix_version;
|
||||||
|
int thrusage;
|
||||||
sigar_cache_t *diskmap;
|
sigar_cache_t *diskmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue