X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=29492ac2ff6347bb0427249056907ca947fa01d1;hb=e4b274ed754af52196d3390b8ce101a7f94e318a;hp=e5c25126939e842a8d16ba84a50a677a123573f5;hpb=838af4cdc6c8674ed3e14a95fea172118c707a85;p=collectd.git diff --git a/src/processes.c b/src/processes.c index e5c25126..29492ac2 100644 --- a/src/processes.c +++ b/src/processes.c @@ -80,84 +80,20 @@ # ifndef CONFIG_HZ # define CONFIG_HZ 100 # endif -#endif /* KERNEL_LINUX */ - -#define MODULE_NAME "processes" +/* #endif KERNEL_LINUX */ -#if HAVE_THREAD_INFO || KERNEL_LINUX -# define PROCESSES_HAVE_READ 1 #else -# define PROCESSES_HAVE_READ 0 +# error "No applicable input method." #endif #define BUFSIZE 256 -static data_source_t state_dsrc[1] = -{ - {"value", DS_TYPE_GAUGE, 0.0, 65535.0} -}; - -static data_set_t state_ds = -{ - "ps_state", 1, state_dsrc -}; - -static data_source_t rss_dsrc[1] = -{ - /* max = 2^63 - 1 */ - {"value", DS_TYPE_GAUGE, 0.0, 9223372036854775807.0} -}; - -static data_set_t rss_ds = -{ - "ps_rss", 1, rss_dsrc -}; - -static data_source_t time_dsrc[2] = -{ - /* 1 second in user-mode per second ought to be enough.. */ - {"user", DS_TYPE_COUNTER, 0.0, 1000000.0}, - {"syst", DS_TYPE_COUNTER, 0.0, 1000000.0} -}; - -static data_set_t time_ds = -{ - "ps_cputime", 2, time_dsrc -}; - -static data_source_t count_dsrc[2] = -{ - /* 1 second in user-mode per second ought to be enough.. */ - {"processes", DS_TYPE_GAUGE, 0.0, 1000000.0}, - {"threads", DS_TYPE_GAUGE, 0.0, 1000000.0} -}; - -static data_set_t count_ds = -{ - "ps_count", 2, count_dsrc -}; - -static data_source_t pagefaults_dsrc[2] = -{ - /* max = 2^63 - 1 */ - {"minflt", DS_TYPE_COUNTER, 0.0, 9223372036854775807.0}, - {"majflt", DS_TYPE_COUNTER, 0.0, 9223372036854775807.0} -}; - -static data_set_t pagefaults_ds = -{ - "ps_pagefaults", 2, pagefaults_dsrc -}; - -#if PROCESSES_HAVE_READ -#if HAVE_THREAD_INFO | KERNEL_LINUX static const char *config_keys[] = { "Process", NULL }; static int config_keys_num = 1; -#endif typedef struct procstat_entry_s { @@ -200,9 +136,7 @@ typedef struct procstat struct procstat_entry_s *instances; } procstat_t; -#if HAVE_THREAD_INFO | KERNEL_LINUX static procstat_t *list_head_g = NULL; -#endif #if HAVE_THREAD_INFO static mach_port_t port_host_self; @@ -216,7 +150,6 @@ static mach_msg_type_number_t pset_list_len; static long pagesize_g; #endif /* KERNEL_LINUX */ -#if HAVE_THREAD_INFO | KERNEL_LINUX static void ps_list_register (const char *name) { procstat_t *new; @@ -427,7 +360,6 @@ static int ps_config (const char *key, const char *value) return (0); } -#endif /* HAVE_THREAD_INFO | KERNEL_LINUX */ static int ps_init (void) { @@ -622,14 +554,11 @@ int ps_read_process (int pid, procstat_t *ps, char *state) fields_len = strsplit (buffer, fields, 64); if (fields_len < 24) { - DEBUG ("`%s' has only %i fields..", - filename, fields_len); + DEBUG ("processes plugin: ps_read_process (pid = %i):" + " `%s' has only %i fields..", + (int) pid, filename, fields_len); return (-1); } - else if (fields_len != 41) - { - DEBUG ("WARNING: (fields_len = %i) != 41", fields_len); - } /* copy the name, strip brackets in the process */ name_len = strlen (fields[1]) - 2; @@ -644,17 +573,21 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ppid = atoi (fields[3]); - if ((tasks = ps_read_tasks (pid)) == NULL) + *state = fields[2][0]; + + if (*state == 'Z') { - /* This happends for zombied, e.g. */ - DEBUG ("ps_read_tasks (%i) failed.", pid); - *state = 'Z'; ps->num_lwp = 0; ps->num_proc = 0; } + else if ((tasks = ps_read_tasks (pid)) == NULL) + { + /* Kernel 2.4 or so */ + ps->num_lwp = 1; + ps->num_proc = 1; + } else { - *state = '\0'; ps->num_lwp = 0; ps->num_proc = 1; for (i = 0; tasks[i] != 0; i++) @@ -664,10 +597,10 @@ int ps_read_process (int pid, procstat_t *ps, char *state) tasks = NULL; } - /* Leave the rest at zero if this is only an LWP */ + /* Leave the rest at zero if this is only a zombi */ if (ps->num_proc == 0) { - DEBUG ("This is only an LWP: pid = %i; name = %s;", + DEBUG ("This is only a zombi: pid = %i; name = %s;", pid, ps->name); return (0); } @@ -687,8 +620,6 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ps->cpu_system_counter = (unsigned long) cpu_system_counter; ps->vmem_rss = (unsigned long) vmem_rss; - *state = fields[2][0]; - /* success */ return (0); } /* int ps_read_process (...) */ @@ -1010,7 +941,9 @@ static int ps_read (void) if ((proc = opendir ("/proc")) == NULL) { - ERROR ("Cannot open `/proc': %s", strerror (errno)); + char errbuf[1024]; + ERROR ("Cannot open `/proc': %s", + sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } @@ -1074,23 +1007,11 @@ static int ps_read (void) return (0); } /* int ps_read */ -#endif /* PROCESSES_HAVE_READ */ void module_register (void) { - plugin_register_data_set (&state_ds); - plugin_register_data_set (&rss_ds); - plugin_register_data_set (&time_ds); - plugin_register_data_set (&count_ds ); - plugin_register_data_set (&pagefaults_ds ); - -#if PROCESSES_HAVE_READ -#if HAVE_THREAD_INFO | KERNEL_LINUX plugin_register_config ("processes", ps_config, config_keys, config_keys_num); -#endif plugin_register_init ("processes", ps_init); plugin_register_read ("processes", ps_read); -#endif /* PROCESSES_HAVE_READ */ -} - +} /* void module_register */