diff options
Diffstat (limited to 'sysutils/collectd/patches/patch-src_processes.c')
-rw-r--r-- | sysutils/collectd/patches/patch-src_processes.c | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/sysutils/collectd/patches/patch-src_processes.c b/sysutils/collectd/patches/patch-src_processes.c new file mode 100644 index 00000000000..85b48401eb1 --- /dev/null +++ b/sysutils/collectd/patches/patch-src_processes.c @@ -0,0 +1,249 @@ +$NetBSD: patch-src_processes.c,v 1.1 2015/08/14 15:39:28 he Exp $ + +Add a port to NetBSD. + +--- src/processes.c.orig 2015-05-20 12:04:47.000000000 +0000 ++++ src/processes.c +@@ -94,13 +94,13 @@ + # endif + /* #endif KERNEL_LINUX */ + +-#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) ++#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) + # include <kvm.h> + # include <sys/param.h> + # include <sys/sysctl.h> + # include <sys/user.h> + # include <sys/proc.h> +-/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */ ++/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) */ + + #elif HAVE_PROCINFO_H + # include <procinfo.h> +@@ -229,9 +229,14 @@ static mach_msg_type_number_t pset_l + static long pagesize_g; + /* #endif KERNEL_LINUX */ + +-#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) ++#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) + static int pagesize; +-/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */ ++ ++#if KERNEL_NETBSD ++int maxslp; ++#endif ++ ++/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) */ + + #elif HAVE_PROCINFO_H + static struct procentry64 procentry[MAXPROCENTRY]; +@@ -638,9 +643,20 @@ static int ps_init (void) + pagesize_g, CONFIG_HZ); + /* #endif KERNEL_LINUX */ + +-#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) ++#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) ++#if KERNEL_NETBSD ++ int mib[2]; ++ size_t size; ++ ++ mib[0] = CTL_VM; ++ mib[1] = VM_MAXSLP; ++ size = sizeof(maxslp); ++ if (sysctl(mib, 2, &maxslp, &size, NULL, 0) == -1) ++ maxslp = 20; /* reasonable default? */ ++#endif ++ + pagesize = getpagesize(); +-/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */ ++/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD || HAVE_STRUCT_KINFO_PROC_NETBSD) */ + + #elif HAVE_PROCINFO_H + pagesize = getpagesize(); +@@ -1940,6 +1956,186 @@ static int ps_read (void) + ps_submit_proc_list (ps_ptr); + /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */ + ++#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_NETBSD ++ int running = 0; ++ int sleeping = 0; ++ int zombies = 0; ++ int stopped = 0; ++ int blocked = 0; ++ int idle = 0; ++ int wait = 0; ++ ++ kvm_t *kd; ++ char errbuf[_POSIX2_LINE_MAX]; ++ struct kinfo_proc2 *procs; /* array of processes */ ++ struct kinfo_proc2 *proc_ptr = NULL; ++ struct kinfo_proc2 *p; ++ int count; /* returns number of processes */ ++ int i; ++ int l, nlwps; ++ struct kinfo_lwp *kl; ++ ++ procstat_t *ps_ptr; ++ procstat_entry_t pse; ++ ++ ps_list_reset (); ++ ++ /* Open the kvm interface, get a descriptor */ ++ kd = kvm_openfiles (NULL, NULL, NULL, KVM_NO_FILES, errbuf); ++ if (kd == NULL) ++ { ++ ERROR ("processes plugin: Cannot open kvm interface: %s", ++ errbuf); ++ return (0); ++ } ++ ++ /* Get the list of processes. */ ++ procs = kvm_getproc2(kd, KERN_PROC_ALL, 0, ++ sizeof(struct kinfo_proc2), &count); ++ if (procs == NULL) ++ { ++ ERROR ("processes plugin: Cannot get kvm processes list: %s", ++ kvm_geterr(kd)); ++ kvm_close (kd); ++ return (0); ++ } ++ ++ /* Iterate through the processes in kinfo_proc */ ++ for (i = 0; i < count; i++) ++ { ++ /* Create only one process list entry per _process_, i.e. ++ * filter out threads (duplicate PID entries). */ ++ if ((proc_ptr == NULL) || (proc_ptr->p_pid != procs[i].p_pid)) ++ { ++ char cmdline[CMDLINE_BUFFER_SIZE] = ""; ++ _Bool have_cmdline = 0; ++ ++ proc_ptr = &(procs[i]); ++ /* Don't probe system processes and processes without arguments */ ++ if (((procs[i].p_flag & P_SYSTEM) == 0) ++ && (procs[i].p_comm[0] != 0)) ++ { ++ char **argv; ++ int argc; ++ int status; ++ ++ /* retrieve the arguments */ ++ argv = kvm_getargv2 (kd, proc_ptr, 0); ++ argc = 0; ++ if ((argv != NULL) && (argv[0] != NULL)) ++ { ++ while (argv[argc] != NULL) ++ argc++; ++ ++ status = strjoin (cmdline, sizeof (cmdline), argv, argc, " "); ++ if (status < 0) ++ WARNING ("processes plugin: Command line did not fit into buffer."); ++ else ++ have_cmdline = 1; ++ } ++ } /* if (process has argument list) */ ++ ++ pse.id = procs[i].p_pid; ++ pse.age = 0; ++ ++ pse.num_proc = 1; ++ pse.num_lwp = procs[i].p_nlwps; ++ ++ pse.vmem_size = procs[i].p_uru_maxrss * pagesize; ++ pse.vmem_rss = procs[i].p_vm_rssize * pagesize; ++ pse.vmem_data = procs[i].p_vm_dsize * pagesize; ++ pse.vmem_code = procs[i].p_vm_tsize * pagesize; ++ pse.stack_size = procs[i].p_vm_ssize * pagesize; ++ pse.vmem_minflt = 0; ++ pse.vmem_minflt_counter = procs[i].p_uru_minflt; ++ pse.vmem_majflt = 0; ++ pse.vmem_majflt_counter = procs[i].p_uru_majflt; ++ ++ pse.cpu_user = 0; ++ pse.cpu_system = 0; ++ pse.cpu_user_counter = 0; ++ pse.cpu_system_counter = 0; ++ /* ++ * The u-area might be swapped out, and we can't get ++ * at it because we have a crashdump and no swap. ++ * If it's here fill in these fields, otherwise, just ++ * leave them 0. ++ */ ++ if (procs[i].p_flag & P_INMEM) ++ { ++ pse.cpu_user_counter = procs[i].p_uutime_usec ++ + (1000000lu * procs[i].p_uutime_sec); ++ pse.cpu_system_counter = procs[i].p_ustime_usec ++ + (1000000lu * procs[i].p_ustime_sec); ++ } ++ ++ /* no I/O data */ ++ pse.io_rchar = -1; ++ pse.io_wchar = -1; ++ pse.io_syscr = procs[i].p_uru_inblock; ++ pse.io_syscw = procs[i].p_uru_oublock; ++ ++ ps_list_add (procs[i].p_comm, have_cmdline ? cmdline : NULL, &pse); ++ } /* if ((proc_ptr == NULL) || (proc_ptr->ki_pid != procs[i].ki_pid)) */ ++ ++ /* system processes' LWPs end up in "running" state */ ++ if ((procs[i].p_flag & P_SYSTEM) != 0) ++ continue; ++ ++ switch (procs[i].p_realstat) ++ { ++ case SSTOP: ++ case SACTIVE: ++ case SIDL: ++ p = &(procs[i]); ++ /* get info about LWPs */ ++ kl = kvm_getlwps(kd, p->p_pid, (u_long)p->p_paddr, ++ sizeof(struct kinfo_lwp), &nlwps); ++ ++ for (l = 0; l < nlwps; l++) { ++ switch (kl[l].l_stat) { ++ case LSONPROC: ++ case LSRUN: ++ running++; ++ break; ++ case LSSLEEP: ++ if (kl[l].l_flag & L_SINTR) { ++ if (kl[l].l_slptime > maxslp) ++ idle++; ++ else ++ sleeping++; ++ } else ++ blocked++; ++ break; ++ case LSSTOP: ++ stopped++; break; ++ case LSIDL: ++ idle++; break; ++ } ++ } ++ break; ++ case SZOMB: ++ case SDYING: ++ case SDEAD: ++ zombies++; break; ++ ++ } ++ } ++ ++ kvm_close(kd); ++ ++ ps_submit_state ("running", running); ++ ps_submit_state ("sleeping", sleeping); ++ ps_submit_state ("zombies", zombies); ++ ps_submit_state ("stopped", stopped); ++ ps_submit_state ("blocked", blocked); ++ ps_submit_state ("idle", idle); ++ ps_submit_state ("wait", wait); ++ ++ for (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_NETBSD */ ++ + #elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_OPENBSD + int running = 0; + int sleeping = 0; |