X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=0513a156a999d4330ca63599b176abc31b68682d;hb=4d1136a79358170b5881417409f2750964b2ba91;hp=efc64d0125af349a115bdd3c9b2bbcae7f8f30d4;hpb=43aca8ed8b22a7a5a14f8c740948d6ce06efbc95;p=collectd.git diff --git a/src/processes.c b/src/processes.c index efc64d01..0513a156 100644 --- a/src/processes.c +++ b/src/processes.c @@ -35,9 +35,9 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" /* Include header files for the mach system, if they exist.. */ #if HAVE_THREAD_INFO @@ -128,7 +128,13 @@ # undef SAVE_FOB_64 #endif +# include # include + +#ifndef MAXCOMLEN +# define MAXCOMLEN 16 +#endif + /* #endif KERNEL_SOLARIS */ #else @@ -360,43 +366,38 @@ static int ps_list_match (const char *name, const char *cmdline, procstat_t *ps) return (0); } /* int ps_list_match */ -static void ps_update_counter ( - _Bool init, - derive_t *group_counter, - derive_t *curr_counter, unsigned long *curr_value, - derive_t new_counter, unsigned long new_value) { - if (init) - { - *curr_value = new_value; - *curr_counter += new_value; - *group_counter += new_value; - return; - } - - if (new_counter < *curr_counter) - { - *curr_value = new_counter + (ULONG_MAX - *curr_counter); - } - else - { - *curr_value = new_counter - *curr_counter; - } - *curr_counter = new_counter; - *group_counter += *curr_value; +static void ps_update_counter (_Bool init, derive_t *group_counter, + derive_t *curr_counter, unsigned long *curr_value, + derive_t new_counter, unsigned long new_value) +{ + if (init) + { + *curr_value = new_value; + *curr_counter += new_value; + *group_counter += new_value; + return; + } + + if (new_counter < *curr_counter) + *curr_value = new_counter + (ULONG_MAX - *curr_counter); + else + *curr_value = new_counter - *curr_counter; + + *curr_counter = new_counter; + *group_counter += *curr_value; } /* add process entry to 'instances' of process 'name' (or refresh it) */ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t *entry) { - procstat_t *ps; procstat_entry_t *pse; if (entry->id == 0) return; - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) { - _Bool want_init; + _Bool want_init; if ((ps_list_match (name, cmdline, ps)) == 0) continue; @@ -480,11 +481,10 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t /* remove old entries from instances of processes in list_head_g */ static void ps_list_reset (void) { - procstat_t *ps; procstat_entry_t *pse; procstat_entry_t *pse_prev; - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) { ps->num_proc = 0; ps->num_lwp = 0; @@ -536,9 +536,13 @@ static void ps_list_reset (void) /* put all pre-defined 'Process' names from config to list_head_g tree */ static int ps_config (oconfig_item_t *ci) { - int i; +#if KERNEL_LINUX + const size_t max_procname_len = 15; +#elif KERNEL_SOLARIS || KERNEL_FREEBSD + const size_t max_procname_len = MAXCOMLEN -1; +#endif - for (i = 0; i < ci->children_num; ++i) { + for (int i = 0; i < ci->children_num; ++i) { oconfig_item_t *c = ci->children + i; if (strcasecmp (c->key, "Process") == 0) @@ -558,6 +562,15 @@ static int ps_config (oconfig_item_t *ci) c->children_num, c->values[0].value.string); } +#if KERNEL_LINUX || KERNEL_SOLARIS || KERNEL_FREEBSD + if (strlen (c->values[0].value.string) > max_procname_len) { + WARNING ("processes plugin: this platform has a %zu character limit " + "to process names. The `Process \"%s\"' option will " + "not work as expected.", + max_procname_len, c->values[0].value.string); + } +#endif + ps_list_register (c->values[0].value.string, NULL); } else if (strcasecmp (c->key, "ProcessMatch") == 0) @@ -861,8 +874,8 @@ static procstat_t *ps_read_tasks_status (long pid, procstat_t *ps) if (fclose (fh)) { char errbuf[1024]; - WARNING ("processes: fclose: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + WARNING ("processes: fclose: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); } } closedir (dh); @@ -1038,13 +1051,11 @@ static int ps_read_process (long pid, procstat_t *ps, char *state) * strchr(3) and strrchr(3) to avoid pointer arithmetic which would * otherwise be required to determine name_len. */ name_start_pos = 0; - while ((buffer[name_start_pos] != '(') - && (name_start_pos < buffer_len)) + while (name_start_pos < buffer_len && buffer[name_start_pos] != '(') name_start_pos++; name_end_pos = buffer_len; - while ((buffer[name_end_pos] != ')') - && (name_end_pos > 0)) + while (name_end_pos > 0 && buffer[name_end_pos] != ')') name_end_pos--; /* Either '(' or ')' is not found or they are in the wrong order. @@ -1092,7 +1103,7 @@ static int ps_read_process (long pid, procstat_t *ps, char *state) ps->vmem_code = -1; DEBUG("ps_read_process: did not get vmem data for pid %li", pid); } - if (ps->num_lwp <= 0) + if (ps->num_lwp == 0) ps->num_lwp = 1; ps->num_proc = 1; } @@ -1216,7 +1227,7 @@ static char *ps_get_cmdline (long pid, char *name, char *buf, size_t buf_len) buf_ptr += status; len -= status; - if (len <= 0) + if (len == 0) break; } @@ -1452,13 +1463,12 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) static int read_fork_rate (void) { extern kstat_ctl_t *kc; - kstat_t *ksp_chain = NULL; derive_t result = 0; if (kc == NULL) return (-1); - for (ksp_chain = kc->kc_chain; + for (kstat_t *ksp_chain = kc->kc_chain; ksp_chain != NULL; ksp_chain = ksp_chain->ks_next) { @@ -1524,17 +1534,14 @@ static int ps_read (void) #if HAVE_THREAD_INFO kern_return_t status; - int pset; processor_set_t port_pset_priv; - int task; task_array_t task_list; mach_msg_type_number_t task_list_len; int task_pid; char task_name[MAXCOMLEN + 1]; - int thread; thread_act_array_t thread_list; mach_msg_type_number_t thread_list_len; thread_basic_info_data_t thread_data; @@ -1559,7 +1566,7 @@ static int ps_read (void) * Tasks are assigned to sets of processors, so that's where you go to * get a list. */ - for (pset = 0; pset < pset_list_len; pset++) + for (mach_msg_type_number_t pset = 0; pset < pset_list_len; pset++) { if ((status = host_processor_set_priv (port_host_self, pset_list[pset], @@ -1580,7 +1587,7 @@ static int ps_read (void) continue; } - for (task = 0; task < task_list_len; task++) + for (mach_msg_type_number_t task = 0; task < task_list_len; task++) { ps = NULL; if (mach_get_task_name (task_list[task], @@ -1678,7 +1685,7 @@ static int ps_read (void) continue; /* with next task_list */ } - for (thread = 0; thread < thread_list_len; thread++) + for (mach_msg_type_number_t thread = 0; thread < thread_list_len; thread++) { thread_data_len = THREAD_BASIC_INFO_COUNT; status = thread_info (thread_list[thread], @@ -1809,8 +1816,6 @@ static int ps_read (void) procstat_entry_t pse; char state; - procstat_t *ps_ptr; - running = sleeping = zombies = stopped = paging = blocked = 0; ps_list_reset (); @@ -1891,7 +1896,7 @@ static int ps_read (void) ps_submit_state ("paging", paging); ps_submit_state ("blocked", blocked); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); read_fork_rate(); @@ -1911,9 +1916,7 @@ static int ps_read (void) struct kinfo_proc *procs; /* array of processes */ struct kinfo_proc *proc_ptr = NULL; int count; /* returns number of processes */ - int i; - procstat_t *ps_ptr; procstat_entry_t pse; ps_list_reset (); @@ -1938,7 +1941,7 @@ static int ps_read (void) } /* Iterate through the processes in kinfo_proc */ - for (i = 0; i < count; i++) + for (int i = 0; i < count; i++) { /* Create only one process list entry per _process_, i.e. * filter out threads (duplicate PID entries). */ @@ -2041,7 +2044,7 @@ static int ps_read (void) ps_submit_state ("idle", idle); ps_submit_state ("wait", wait); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */ @@ -2059,9 +2062,7 @@ static int ps_read (void) struct kinfo_proc *procs; /* array of processes */ struct kinfo_proc *proc_ptr = NULL; int count; /* returns number of processes */ - int i; - procstat_t *ps_ptr; procstat_entry_t pse; ps_list_reset (); @@ -2086,7 +2087,7 @@ static int ps_read (void) } /* Iterate through the processes in kinfo_proc */ - for (i = 0; i < count; i++) + for (int i = 0; i < count; i++) { /* Create only one process list entry per _process_, i.e. * filter out threads (duplicate PID entries). */ @@ -2178,7 +2179,7 @@ static int ps_read (void) ps_submit_state ("idle", idle); ps_submit_state ("dead", dead); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_OPENBSD */ @@ -2194,7 +2195,6 @@ static int ps_read (void) pid_t pindex = 0; int nprocs; - procstat_t *ps; procstat_entry_t pse; ps_list_reset (); @@ -2202,9 +2202,7 @@ static int ps_read (void) /* fdsinfo = */ NULL, sizeof(struct fdsinfo64), &pindex, MAXPROCENTRY)) > 0) { - int i; - - for (i = 0; i < nprocs; i++) + for (int i = 0; i < nprocs; i++) { tid64_t thindex; int nthreads; @@ -2315,7 +2313,7 @@ static int ps_read (void) ps_submit_state ("paging", paging); ps_submit_state ("blocked", blocked); - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) ps_submit_proc_list (ps); /* #endif HAVE_PROCINFO_H */ @@ -2339,7 +2337,6 @@ static int ps_read (void) DIR *proc; int status; - procstat_t *ps_ptr; char state; char cmdline[PRARGSZ]; @@ -2429,7 +2426,7 @@ static int ps_read (void) ps_submit_state ("system", system); ps_submit_state ("orphan", orphan); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); read_fork_rate();