remove proc_list optimization. while max_proc wont change, it may be set to
an a very large number seems that can make pstat_getproc choke. change to loop through with a small array.
This commit is contained in:
parent
79f6f36447
commit
554e241136
|
@ -15,8 +15,6 @@ int sigar_os_open(sigar_t **sigar)
|
||||||
sizeof((*sigar)->pstatic),
|
sizeof((*sigar)->pstatic),
|
||||||
1, 0);
|
1, 0);
|
||||||
|
|
||||||
(*sigar)->proctab = NULL;
|
|
||||||
|
|
||||||
(*sigar)->ticks = sysconf(_SC_CLK_TCK);
|
(*sigar)->ticks = sysconf(_SC_CLK_TCK);
|
||||||
|
|
||||||
(*sigar)->last_pid = -1;
|
(*sigar)->last_pid = -1;
|
||||||
|
@ -29,9 +27,6 @@ int sigar_os_open(sigar_t **sigar)
|
||||||
|
|
||||||
int sigar_os_close(sigar_t *sigar)
|
int sigar_os_close(sigar_t *sigar)
|
||||||
{
|
{
|
||||||
if (sigar->proctab) {
|
|
||||||
free(sigar->proctab);
|
|
||||||
}
|
|
||||||
if (sigar->pinfo) {
|
if (sigar->pinfo) {
|
||||||
free(sigar->pinfo);
|
free(sigar->pinfo);
|
||||||
}
|
}
|
||||||
|
@ -170,27 +165,28 @@ int sigar_loadavg_get(sigar_t *sigar,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PROC_ELTS 16
|
||||||
|
|
||||||
int sigar_proc_list_get(sigar_t *sigar,
|
int sigar_proc_list_get(sigar_t *sigar,
|
||||||
sigar_proc_list_t *proclist)
|
sigar_proc_list_t *proclist)
|
||||||
{
|
{
|
||||||
int n;
|
int num, idx=0;
|
||||||
|
struct pst_status proctab[PROC_ELTS];
|
||||||
|
|
||||||
if (!sigar->proctab) {
|
sigar_proc_list_create(proclist);
|
||||||
/* malloc this only once per-sigar_t as the size will not change */
|
|
||||||
sigar->proctab = malloc(sizeof(*sigar->proctab) *
|
while ((num = pstat_getproc(proctab, sizeof(proctab[0]),
|
||||||
sigar->pstatic.max_proc);
|
PROC_ELTS, idx)) > 0)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<num; i++) {
|
||||||
|
SIGAR_PROC_LIST_GROW(proclist);
|
||||||
|
proclist->data[proclist->number++] =
|
||||||
|
proctab[i].pst_pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = pstat_getproc(sigar->proctab, sizeof(*sigar->proctab),
|
idx = proctab[num-1].pst_idx + 1;
|
||||||
sigar->pstatic.max_proc, 0);
|
|
||||||
|
|
||||||
proclist->number = 0;
|
|
||||||
proclist->size = n;
|
|
||||||
proclist->data = malloc(sizeof(*(proclist->data)) * n);
|
|
||||||
|
|
||||||
for (n=0; n<proclist->size; n++) {
|
|
||||||
proclist->data[proclist->number++] =
|
|
||||||
sigar->proctab[n].pst_pid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
SIGAR_T_BASE;
|
SIGAR_T_BASE;
|
||||||
struct pst_static pstatic;
|
struct pst_static pstatic;
|
||||||
struct pst_status *proctab;
|
|
||||||
time_t last_getprocs;
|
time_t last_getprocs;
|
||||||
sigar_pid_t last_pid;
|
sigar_pid_t last_pid;
|
||||||
struct pst_status *pinfo;
|
struct pst_status *pinfo;
|
||||||
|
|
Loading…
Reference in New Issue