diff --git a/src/processes.c b/src/processes.c
index bda096a1920dfb25246f1258b67472be779fe4ff..99af276a6f48eb0044dff82db80b8e55cd533a90 100644 (file)
--- a/src/processes.c
+++ b/src/processes.c
* Copyright (C) 2006-2008 Florian octo Forster
* Copyright (C) 2008 Oleg King
* Copyright (C) 2009 Sebastian Harl
+ * Copyright (C) 2009 Andrés J. Díaz
* Copyright (C) 2009 Manuel Sanmartin
*
* This program is free software; you can redistribute it and/or modify it
* Florian octo Forster <octo at verplant.org>
* Oleg King <king2 at kaluga.ru>
* Sebastian Harl <sh at tokkee.org>
+ * Andrés J. Díaz <ajdiaz at connectical.com>
* Manuel Sanmartin
**/
unsigned long cpu_system_counter;
/* io data */
- long io_rchar;
- long io_wchar;
- long io_syscr;
- long io_syscw;
+ derive_t io_rchar;
+ derive_t io_wchar;
+ derive_t io_syscr;
+ derive_t io_syscw;
struct procstat_entry_s *next;
} procstat_entry_t;
unsigned long cpu_system_counter;
/* io data */
- long io_rchar;
- long io_wchar;
- long io_syscr;
- long io_syscw;
+ derive_t io_rchar;
+ derive_t io_wchar;
+ derive_t io_syscr;
+ derive_t io_syscw;
struct procstat *next;
struct procstat_entry_s *instances;
ERROR ("processes plugin: ps_list_register: "
"Regular expression \"%s\" found in config "
"file, but support for regular expressions "
- "has been dispabled at compile time.",
+ "has been disabled at compile time.",
regexp);
sfree (new);
return;
}
#endif
-
+
for (ptr = list_head_g; ptr != NULL; ptr = ptr->next)
{
if (strcmp (ptr->name, name) == 0)
@@ -342,13 +344,13 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
if ((pse == NULL) || (pse->id != entry->id))
{
procstat_entry_t *new;
-
+
new = (procstat_entry_t *) malloc (sizeof (procstat_entry_t));
if (new == NULL)
return;
memset (new, 0, sizeof (procstat_entry_t));
new->id = entry->id;
-
+
if (pse == NULL)
ps->instances = new;
else
@@ -400,7 +402,7 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
pse->vmem_minflt = entry->vmem_minflt_counter - pse->vmem_minflt_counter;
}
pse->vmem_minflt_counter = entry->vmem_minflt_counter;
-
+
if (entry->vmem_majflt_counter < pse->vmem_majflt_counter)
{
pse->vmem_majflt = entry->vmem_majflt_counter
@@ -437,7 +439,7 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
pse->cpu_user = entry->cpu_user_counter - pse->cpu_user_counter;
}
pse->cpu_user_counter = entry->cpu_user_counter;
-
+
if (entry->cpu_system_counter < pse->cpu_system_counter)
{
pse->cpu_system = entry->cpu_system_counter
if ( (ps->io_rchar != -1) && (ps->io_wchar != -1) )
{
sstrncpy (vl.type, "ps_disk_octets", sizeof (vl.type));
- vl.values[0].counter = ps->io_rchar;
- vl.values[1].counter = ps->io_wchar;
+ vl.values[0].derive = ps->io_rchar;
+ vl.values[1].derive = ps->io_wchar;
vl.values_len = 2;
plugin_dispatch_values (&vl);
}
if ( (ps->io_syscr != -1) && (ps->io_syscw != -1) )
{
sstrncpy (vl.type, "ps_disk_ops", sizeof (vl.type));
- vl.values[0].counter = ps->io_syscr;
- vl.values[1].counter = ps->io_syscw;
+ vl.values[0].derive = ps->io_syscr;
+ vl.values[1].derive = ps->io_syscw;
vl.values_len = 2;
plugin_dispatch_values (&vl);
}
DEBUG ("name = %s; num_proc = %lu; num_lwp = %lu; vmem_rss = %lu; "
"vmem_minflt_counter = %lu; vmem_majflt_counter = %lu; "
"cpu_user_counter = %lu; cpu_system_counter = %lu; "
- "io_rchar = %ld; io_wchar = %ld; "
- "io_syscr = %ld; io_syscw = %ld;",
+ "io_rchar = %"PRIi64"; io_wchar = %"PRIi64"; "
+ "io_syscr = %"PRIi64"; io_syscw = %"PRIi64";",
ps->name, ps->num_proc, ps->num_lwp, ps->vmem_rss,
ps->vmem_minflt_counter, ps->vmem_majflt_counter,
ps->cpu_user_counter, ps->cpu_system_counter,
while (fgets (buffer, 1024, fh) != NULL)
{
- long *val = NULL;
+ derive_t *val = NULL;
+ long long tmp;
+ char *endptr;
if (strncasecmp (buffer, "rchar:", 6) == 0)
val = &(ps->io_rchar);
if (numfields < 2)
continue;
- *val = atol (fields[1]);
- }
+ errno = 0;
+ endptr = NULL;
+ tmp = strtoll (fields[1], &endptr, /* base = */ 10);
+ if ((errno != 0) || (endptr == fields[1]))
+ *val = -1;
+ else
+ *val = (derive_t) tmp;
+ } /* while (fgets) */
if (fclose (fh))
{
@@ -893,13 +903,18 @@ static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len)
if ((pid < 1) || (NULL == buf) || (buf_len < 2))
return NULL;
- ssnprintf (file, sizeof (file), "/proc/%u/cmdline", pid);
+ ssnprintf (file, sizeof (file), "/proc/%u/cmdline",
+ (unsigned int) pid);
+ errno = 0;
fd = open (file, O_RDONLY);
if (fd < 0) {
char errbuf[4096];
- WARNING ("processes plugin: Failed to open `%s': %s.", file,
- sstrerror (errno, errbuf, sizeof (errbuf)));
+ /* ENOENT means the process exited while we were handling it.
+ * Don't complain about this, it only fills the logs. */
+ if (errno != ENOENT)
+ WARNING ("processes plugin: Failed to open `%s': %s.", file,
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return NULL;
}
status = read (fd, (void *)buf_ptr, len);
if (status < 0) {
- char errbuf[4096];
+ char errbuf[1024];
if ((EAGAIN == errno) || (EINTR == errno))
continue;
procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &count);
if (procs == NULL)
{
- kvm_close (kd);
ERROR ("processes plugin: Cannot get kvm processes list: %s",
kvm_geterr(kd));
+ kvm_close (kd);
return (0);
}
/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
#elif HAVE_PROCINFO_H
+ /* AIX */
int running = 0;
int sleeping = 0;
int zombies = 0;
int blocked = 0;
pid_t pindex = 0;
- tid64_t thindex;
- int i;
- int j;
- int n;
int nprocs;
- int nthreads;
procstat_t *ps;
procstat_entry_t pse;
- char arglist[MAXARGLN+1];
- char *cmdline;
- char *cargs;
ps_list_reset ();
- while ((nprocs = getprocs64(procentry, sizeof(struct procentry64), NULL, sizeof(struct fdsinfo64), &pindex, MAXPROCENTRY)) > 0 )
+ while ((nprocs = getprocs64 (procentry, sizeof(struct procentry64),
+ /* fdsinfo = */ NULL, sizeof(struct fdsinfo64),
+ &pindex, MAXPROCENTRY)) > 0)
{
- for ( i=0; i< nprocs; i++)
+ int i;
+
+ for (i = 0; i < nprocs; i++)
{
+ tid64_t thindex;
+ int nthreads;
+ char arglist[MAXARGLN+1];
+ char *cargs;
+ char *cmdline;
+
if (procentry[i].pi_state == SNONE) continue;
/* if (procentry[i].pi_state == SZOMB) FIXME */
{
if (getargs(&procentry[i], sizeof(struct procentry64), arglist, MAXARGLN) >= 0)
{
+ int n;
+
n = -1;
while (++n < MAXARGLN)
{
pse.num_proc = 1;
thindex=0;
- while ((nthreads = getthrds64(procentry[i].pi_pid, thrdentry, sizeof(struct thrdentry64), &thindex, MAXTHRDENTRY)) > 0)
+ while ((nthreads = getthrds64(procentry[i].pi_pid,
+ thrdentry, sizeof(struct thrdentry64),
+ &thindex, MAXTHRDENTRY)) > 0)
{
+ int j;
+
for (j=0; j< nthreads; j++)
{
switch (thrdentry[j].ti_state)
pse.vmem_rss = (procentry[i].pi_drss + procentry[i].pi_trss) * pagesize;
pse.stack_size = 0;
+ pse.io_rchar = -1;
+ pse.io_wchar = -1;
+ pse.io_syscr = -1;
+ pse.io_syscw = -1;
+
ps_list_add (cmdline, cargs, &pse);
- }
+ } /* for (i = 0 .. nprocs) */
+
if (nprocs < MAXPROCENTRY)
break;
- }
+ } /* while (getprocs64() > 0) */
ps_submit_state ("running", running);
ps_submit_state ("sleeping", sleeping);
ps_submit_state ("zombies", zombies);