diff options
Diffstat (limited to '')
-rw-r--r-- | library/include/devname.h | 10 | ||||
-rw-r--r-- | library/include/diskstats.h | 135 | ||||
-rw-r--r-- | library/include/escape.h | 35 | ||||
-rw-r--r-- | library/include/meminfo.h | 216 | ||||
-rw-r--r-- | library/include/misc.h | 90 | ||||
-rw-r--r-- | library/include/numa.h | 30 | ||||
-rw-r--r-- | library/include/pids.h | 287 | ||||
-rw-r--r-- | library/include/procps-private.h | 28 | ||||
-rw-r--r-- | library/include/pwcache.h | 38 | ||||
-rw-r--r-- | library/include/readproc.h | 303 | ||||
-rw-r--r-- | library/include/slabinfo.h | 140 | ||||
-rw-r--r-- | library/include/stat.h | 175 | ||||
-rw-r--r-- | library/include/vmstat.h | 382 | ||||
-rw-r--r-- | library/include/wchan.h | 27 | ||||
-rw-r--r-- | library/include/xtra-procps-debug.h | 208 |
15 files changed, 2104 insertions, 0 deletions
diff --git a/library/include/devname.h b/library/include/devname.h new file mode 100644 index 0000000..467cd29 --- /dev/null +++ b/library/include/devname.h @@ -0,0 +1,10 @@ +#ifndef PROC_DEVNAME_H +#define PROC_DEVNAME_H + +#define ABBREV_DEV 1 /* remove /dev/ */ +#define ABBREV_TTY 2 /* remove tty */ +#define ABBREV_PTS 4 /* remove pts/ */ + +unsigned dev_to_tty(char *__restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned int flags); + +#endif diff --git a/library/include/diskstats.h b/library/include/diskstats.h new file mode 100644 index 0000000..d5a4b1f --- /dev/null +++ b/library/include/diskstats.h @@ -0,0 +1,135 @@ +/* + * diskstats.h - disk I/O related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef PROCPS_DISKSTATS_H +#define PROCPS_DISKSTATS_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum diskstats_item { + DISKSTATS_noop, // ( never altered ) + DISKSTATS_extra, // ( reset to zero ) + // returns origin, see proc(5) + // ------- ------------------- + DISKSTATS_NAME, // str /proc/diskstats + DISKSTATS_TYPE, // s_int " + DISKSTATS_MAJOR, // s_int " + DISKSTATS_MINOR, // s_int " + + DISKSTATS_READS, // ul_int " + DISKSTATS_READS_MERGED, // ul_int " + DISKSTATS_READ_SECTORS, // ul_int " + DISKSTATS_READ_TIME, // ul_int " + DISKSTATS_WRITES, // ul_int " + DISKSTATS_WRITES_MERGED, // ul_int " + DISKSTATS_WRITE_SECTORS, // ul_int " + DISKSTATS_WRITE_TIME, // ul_int " + DISKSTATS_IO_TIME, // ul_int " + DISKSTATS_WEIGHTED_TIME, // ul_int " + + DISKSTATS_IO_INPROGRESS, // s_int " + + DISKSTATS_DELTA_READS, // s_int derived from above + DISKSTATS_DELTA_READS_MERGED, // s_int " + DISKSTATS_DELTA_READ_SECTORS, // s_int " + DISKSTATS_DELTA_READ_TIME, // s_int " + DISKSTATS_DELTA_WRITES, // s_int " + DISKSTATS_DELTA_WRITES_MERGED, // s_int " + DISKSTATS_DELTA_WRITE_SECTORS, // s_int " + DISKSTATS_DELTA_WRITE_TIME, // s_int " + DISKSTATS_DELTA_IO_TIME, // s_int " + DISKSTATS_DELTA_WEIGHTED_TIME // s_int " +}; + +enum diskstats_sort_order { + DISKSTATS_SORT_ASCEND = +1, + DISKSTATS_SORT_DESCEND = -1 +}; + + +struct diskstats_result { + enum diskstats_item item; + union { + signed int s_int; + unsigned long ul_int; + char *str; + } result; +}; + +struct diskstats_stack { + struct diskstats_result *head; +}; + +struct diskstats_reaped { + int total; + struct diskstats_stack **stacks; +}; + +struct diskstats_info; + + +#define DISKSTATS_TYPE_DISK -11111 +#define DISKSTATS_TYPE_PARTITION -22222 + +#define DISKSTATS_GET( info, name, actual_enum, type ) ( { \ + struct diskstats_result *r = procps_diskstats_get( info, name, actual_enum ); \ + r ? r->result . type : 0; } ) + +#define DISKSTATS_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_diskstats_new (struct diskstats_info **info); +int procps_diskstats_ref (struct diskstats_info *info); +int procps_diskstats_unref (struct diskstats_info **info); + +struct diskstats_result *procps_diskstats_get ( + struct diskstats_info *info, + const char *name, + enum diskstats_item item); + +struct diskstats_reaped *procps_diskstats_reap ( + struct diskstats_info *info, + enum diskstats_item *items, + int numitems); + +struct diskstats_stack *procps_diskstats_select ( + struct diskstats_info *info, + const char *name, + enum diskstats_item *items, + int numitems); + +struct diskstats_stack **procps_diskstats_sort ( + struct diskstats_info *info, + struct diskstats_stack *stacks[], + int numstacked, + enum diskstats_item sortitem, + enum diskstats_sort_order order); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/escape.h b/library/include/escape.h new file mode 100644 index 0000000..1f0b0f9 --- /dev/null +++ b/library/include/escape.h @@ -0,0 +1,35 @@ +/* + * escape.h - printing handling + * + * Copyright © 2011-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2016-2023 Craig Small <csmall@dropbear.xyz> + * Copyright © 1998-2005 Albert Cahalan + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_PROC_ESCAPE_H +#define PROCPS_PROC_ESCAPE_H + +#include "readproc.h" + +#define ESC_BRACKETS 0x2 // if using cmd, put '[' and ']' around it +#define ESC_DEFUNCT 0x4 // mark zombies with " <defunct>" + +int escape_command (char *outbuf, const proc_t *pp, int bytes, unsigned flags); + +int escape_str (char *dst, const char *src, int bufsize); + +#endif diff --git a/library/include/meminfo.h b/library/include/meminfo.h new file mode 100644 index 0000000..edca8d2 --- /dev/null +++ b/library/include/meminfo.h @@ -0,0 +1,216 @@ +/* + * meminfo.h - memory related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_MEMINFO_H +#define PROCPS_MEMINFO_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum meminfo_item { + MEMINFO_noop, // ( never altered ) + MEMINFO_extra, // ( reset to zero ) + /* + note: all of the following values are expressed as KiB + */ + // returns origin, see proc(5) + // ------- ------------------- + MEMINFO_MEM_ACTIVE, // ul_int /proc/meminfo + MEMINFO_MEM_ACTIVE_ANON, // ul_int " + MEMINFO_MEM_ACTIVE_FILE, // ul_int " + MEMINFO_MEM_ANON, // ul_int " + MEMINFO_MEM_AVAILABLE, // ul_int " + MEMINFO_MEM_BOUNCE, // ul_int " + MEMINFO_MEM_BUFFERS, // ul_int " + MEMINFO_MEM_CACHED, // ul_int " + MEMINFO_MEM_CACHED_ALL, // ul_int derived from MEM_CACHED + MEM_SLAB_RECLAIM + MEMINFO_MEM_CMA_FREE, // ul_int /proc/meminfo + MEMINFO_MEM_CMA_TOTAL, // ul_int " + MEMINFO_MEM_COMMITTED_AS, // ul_int " + MEMINFO_MEM_COMMIT_LIMIT, // ul_int " + MEMINFO_MEM_DIRECTMAP_1G, // ul_int " + MEMINFO_MEM_DIRECTMAP_2M, // ul_int " + MEMINFO_MEM_DIRECTMAP_4K, // ul_int " + MEMINFO_MEM_DIRECTMAP_4M, // ul_int " + MEMINFO_MEM_DIRTY, // ul_int " + MEMINFO_MEM_FILE_HUGEPAGES, // ul_int " + MEMINFO_MEM_FILE_PMDMAPPED, // ul_int " + MEMINFO_MEM_FREE, // ul_int " + MEMINFO_MEM_HARD_CORRUPTED, // ul_int " + MEMINFO_MEM_HIGH_FREE, // ul_int " + MEMINFO_MEM_HIGH_TOTAL, // ul_int " + MEMINFO_MEM_HIGH_USED, // ul_int derived from MEM_HIGH_TOTAL - MEM_HIGH_FREE + MEMINFO_MEM_HUGETBL, // ul_int /proc/meminfo + MEMINFO_MEM_HUGE_ANON, // ul_int " + MEMINFO_MEM_HUGE_FREE, // ul_int " + MEMINFO_MEM_HUGE_RSVD, // ul_int " + MEMINFO_MEM_HUGE_SIZE, // ul_int " + MEMINFO_MEM_HUGE_SURPLUS, // ul_int " + MEMINFO_MEM_HUGE_TOTAL, // ul_int " + MEMINFO_MEM_INACTIVE, // ul_int " + MEMINFO_MEM_INACTIVE_ANON, // ul_int " + MEMINFO_MEM_INACTIVE_FILE, // ul_int " + MEMINFO_MEM_KERNEL_RECLAIM, // ul_int " + MEMINFO_MEM_KERNEL_STACK, // ul_int " + MEMINFO_MEM_LOCKED, // ul_int " + MEMINFO_MEM_LOW_FREE, // ul_int " + MEMINFO_MEM_LOW_TOTAL, // ul_int " + MEMINFO_MEM_LOW_USED, // ul_int derived from MEM_LOW_TOTAL - MEM_LOW_FREE + MEMINFO_MEM_MAPPED, // ul_int /proc/meminfo + MEMINFO_MEM_MAP_COPY, // ul_int " + MEMINFO_MEM_NFS_UNSTABLE, // ul_int " + MEMINFO_MEM_PAGE_TABLES, // ul_int " + MEMINFO_MEM_PER_CPU, // ul_int " + MEMINFO_MEM_SHADOWCALLSTACK, // ul_int " + MEMINFO_MEM_SHARED, // ul_int " + MEMINFO_MEM_SHMEM_HUGE, // ul_int " + MEMINFO_MEM_SHMEM_HUGE_MAP, // ul_int " + MEMINFO_MEM_SLAB, // ul_int " + MEMINFO_MEM_SLAB_RECLAIM, // ul_int " + MEMINFO_MEM_SLAB_UNRECLAIM, // ul_int " + MEMINFO_MEM_TOTAL, // ul_int " + MEMINFO_MEM_UNEVICTABLE, // ul_int " + MEMINFO_MEM_USED, // ul_int derived from MEM_TOTAL - MEM_AVAILABLE + MEMINFO_MEM_VM_ALLOC_CHUNK, // ul_int /proc/meminfo + MEMINFO_MEM_VM_ALLOC_TOTAL, // ul_int " + MEMINFO_MEM_VM_ALLOC_USED, // ul_int " + MEMINFO_MEM_WRITEBACK, // ul_int " + MEMINFO_MEM_WRITEBACK_TMP, // ul_int " + + MEMINFO_DELTA_ACTIVE, // s_int derived from above + MEMINFO_DELTA_ACTIVE_ANON, // s_int " + MEMINFO_DELTA_ACTIVE_FILE, // s_int " + MEMINFO_DELTA_ANON, // s_int " + MEMINFO_DELTA_AVAILABLE, // s_int " + MEMINFO_DELTA_BOUNCE, // s_int " + MEMINFO_DELTA_BUFFERS, // s_int " + MEMINFO_DELTA_CACHED, // s_int " + MEMINFO_DELTA_CACHED_ALL, // s_int " + MEMINFO_DELTA_CMA_FREE, // s_int " + MEMINFO_DELTA_CMA_TOTAL, // s_int " + MEMINFO_DELTA_COMMITTED_AS, // s_int " + MEMINFO_DELTA_COMMIT_LIMIT, // s_int " + MEMINFO_DELTA_DIRECTMAP_1G, // s_int " + MEMINFO_DELTA_DIRECTMAP_2M, // s_int " + MEMINFO_DELTA_DIRECTMAP_4K, // s_int " + MEMINFO_DELTA_DIRECTMAP_4M, // s_int " + MEMINFO_DELTA_DIRTY, // s_int " + MEMINFO_DELTA_FILE_HUGEPAGES, // s_int " + MEMINFO_DELTA_FILE_PMDMAPPED, // s_int " + MEMINFO_DELTA_FREE, // s_int " + MEMINFO_DELTA_HARD_CORRUPTED, // s_int " + MEMINFO_DELTA_HIGH_FREE, // s_int " + MEMINFO_DELTA_HIGH_TOTAL, // s_int " + MEMINFO_DELTA_HIGH_USED, // s_int " + MEMINFO_DELTA_HUGETBL, // s_int " + MEMINFO_DELTA_HUGE_ANON, // s_int " + MEMINFO_DELTA_HUGE_FREE, // s_int " + MEMINFO_DELTA_HUGE_RSVD, // s_int " + MEMINFO_DELTA_HUGE_SIZE, // s_int " + MEMINFO_DELTA_HUGE_SURPLUS, // s_int " + MEMINFO_DELTA_HUGE_TOTAL, // s_int " + MEMINFO_DELTA_INACTIVE, // s_int " + MEMINFO_DELTA_INACTIVE_ANON, // s_int " + MEMINFO_DELTA_INACTIVE_FILE, // s_int " + MEMINFO_DELTA_KERNEL_RECLAIM, // s_int " + MEMINFO_DELTA_KERNEL_STACK, // s_int " + MEMINFO_DELTA_LOCKED, // s_int " + MEMINFO_DELTA_LOW_FREE, // s_int " + MEMINFO_DELTA_LOW_TOTAL, // s_int " + MEMINFO_DELTA_LOW_USED, // s_int " + MEMINFO_DELTA_MAPPED, // s_int " + MEMINFO_DELTA_MAP_COPY, // s_int " + MEMINFO_DELTA_NFS_UNSTABLE, // s_int " + MEMINFO_DELTA_PAGE_TABLES, // s_int " + MEMINFO_DELTA_PER_CPU, // s_int " + MEMINFO_DELTA_SHADOWCALLSTACK, // s_int " + MEMINFO_DELTA_SHARED, // s_int " + MEMINFO_DELTA_SHMEM_HUGE, // s_int " + MEMINFO_DELTA_SHMEM_HUGE_MAP, // s_int " + MEMINFO_DELTA_SLAB, // s_int " + MEMINFO_DELTA_SLAB_RECLAIM, // s_int " + MEMINFO_DELTA_SLAB_UNRECLAIM, // s_int " + MEMINFO_DELTA_TOTAL, // s_int " + MEMINFO_DELTA_UNEVICTABLE, // s_int " + MEMINFO_DELTA_USED, // s_int " + MEMINFO_DELTA_VM_ALLOC_CHUNK, // s_int " + MEMINFO_DELTA_VM_ALLOC_TOTAL, // s_int " + MEMINFO_DELTA_VM_ALLOC_USED, // s_int " + MEMINFO_DELTA_WRITEBACK, // s_int " + MEMINFO_DELTA_WRITEBACK_TMP, // s_int " + + MEMINFO_SWAP_CACHED, // ul_int /proc/meminfo + MEMINFO_SWAP_FREE, // ul_int " + MEMINFO_SWAP_TOTAL, // ul_int " + MEMINFO_SWAP_USED, // ul_int derived from SWAP_TOTAL - SWAP_FREE + + MEMINFO_SWAP_DELTA_CACHED, // s_int derived from above + MEMINFO_SWAP_DELTA_FREE, // s_int " + MEMINFO_SWAP_DELTA_TOTAL, // s_int " + MEMINFO_SWAP_DELTA_USED // s_int " +}; + + +struct meminfo_result { + enum meminfo_item item; + union { + signed int s_int; + unsigned long ul_int; + } result; +}; + +struct meminfo_stack { + struct meminfo_result *head; +}; + +struct meminfo_info; + + +#define MEMINFO_GET( info, actual_enum, type ) ( { \ + struct meminfo_result *r = procps_meminfo_get( info, actual_enum ); \ + r ? r->result . type : 0; } ) + +#define MEMINFO_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_meminfo_new (struct meminfo_info **info); +int procps_meminfo_ref (struct meminfo_info *info); +int procps_meminfo_unref (struct meminfo_info **info); + +struct meminfo_result *procps_meminfo_get ( + struct meminfo_info *info, + enum meminfo_item item); + +struct meminfo_stack *procps_meminfo_select ( + struct meminfo_info *info, + enum meminfo_item *items, + int numitems); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/misc.h b/library/include/misc.h new file mode 100644 index 0000000..bbfa5e2 --- /dev/null +++ b/library/include/misc.h @@ -0,0 +1,90 @@ +/* + * misc.h - miscellaneous declarations for libproc2 + * + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * Copyright © 2021-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 1998-2003 Albert Cahalan + * Copyright © 1992-1998 Michael K. Johnson <johnsonm@redhat.com> + * Copyright © 1996 Charles Blake <cblake@bbn.com> + * Copyright © 1993 J. Cowley + * Copyright © 1995 Martin Schulze <joey@infodrom.north.de> + * Copyright © ???? Larry Greenfield <greenfie@gauss.rutgers.edu> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROC_MISC_H +#define PROC_MISC_H +#include <sys/types.h> +#include <dirent.h> + +#ifdef __cplusplus +extern "C" { +#endif + + +// ////////////////////////////////////////////////////////////////// +// Platform Particulars ///////////////////////////////////////////// + +long procps_cpu_count (void); +long procps_hertz_get (void); +unsigned int procps_pid_length (void); + + // Convenience macros for composing/decomposing version codes +#define LINUX_VERSION(x,y,z) (0x10000*((x)&0x7fff) + 0x100*((y)&0xff) + ((z)&0xff)) +#define LINUX_VERSION_MAJOR(x) (((x)>>16) & 0xFF) +#define LINUX_VERSION_MINOR(x) (((x)>> 8) & 0xFF) +#define LINUX_VERSION_PATCH(x) ( (x) & 0xFF) + +int procps_linux_version(void); + + +// ////////////////////////////////////////////////////////////////// +// Runtime Particulars ////////////////////////////////////////////// + +int procps_loadavg (double *av1, double *av5, double *av15); +int procps_uptime (double *uptime_secs, double *idle_secs); +char *procps_uptime_sprint (void); +char *procps_uptime_sprint_short (void); + + +// ////////////////////////////////////////////////////////////////// +// Namespace Particulars //////////////////////////////////////////// + +enum namespace_type { + PROCPS_NS_CGROUP, + PROCPS_NS_IPC, + PROCPS_NS_MNT, + PROCPS_NS_NET, + PROCPS_NS_PID, + PROCPS_NS_TIME, + PROCPS_NS_USER, + PROCPS_NS_UTS, + PROCPS_NS_COUNT // total namespaces (fencepost) +}; + +struct procps_ns { + unsigned long ns[PROCPS_NS_COUNT]; +}; + +const char *procps_ns_get_name (const int id); +int procps_ns_get_id (const char *name); +int procps_ns_read_pid (const int pid, struct procps_ns *nsp); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/numa.h b/library/include/numa.h new file mode 100644 index 0000000..5a4368b --- /dev/null +++ b/library/include/numa.h @@ -0,0 +1,30 @@ +/* + * NUMA node support for <PIDS> & <STAT> interfaces + * + * Copyright © 2017-2023 Jim Warner <james.warner@comcast.net> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_NUMA_H +#define PROCPS_NUMA_H + +void numa_init (void); +void numa_uninit (void); + +extern int (*numa_max_node) (void); +extern int (*numa_node_of_cpu) (int); + +#endif diff --git a/library/include/pids.h b/library/include/pids.h new file mode 100644 index 0000000..8245e36 --- /dev/null +++ b/library/include/pids.h @@ -0,0 +1,287 @@ +/* + * pids.h - process related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_PIDS_H +#define PROCPS_PIDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum pids_item { + PIDS_noop, // ( never altered ) + PIDS_extra, // ( reset to zero ) + // returns origin, see proc(5) + // ------- ------------------- + PIDS_ADDR_CODE_END, // ul_int stat: end_code + PIDS_ADDR_CODE_START, // ul_int stat: start_code + PIDS_ADDR_CURR_EIP, // ul_int stat: eip + PIDS_ADDR_CURR_ESP, // ul_int stat: esp + PIDS_ADDR_STACK_START, // ul_int stat: start_stack + PIDS_AUTOGRP_ID, // s_int autogroup + PIDS_AUTOGRP_NICE, // s_int autogroup + PIDS_CGNAME, // str derived from CGROUP ':name=' + PIDS_CGROUP, // str cgroup + PIDS_CGROUP_V, // strv cgroup, as *str[] + PIDS_CMD, // str stat: comm or status: Name + PIDS_CMDLINE, // str cmdline + PIDS_CMDLINE_V, // strv cmdline, as *str[] + PIDS_ENVIRON, // str environ + PIDS_ENVIRON_V, // strv environ, as *str[] + PIDS_EXE, // str exe + PIDS_EXIT_SIGNAL, // s_int stat: exit_signal + PIDS_FLAGS, // ul_int stat: flags + PIDS_FLT_MAJ, // ul_int stat: maj_flt + PIDS_FLT_MAJ_C, // ul_int derived from stat: maj_flt + cmaj_flt + PIDS_FLT_MAJ_DELTA, // s_int derived from FLT_MAJ + PIDS_FLT_MIN, // ul_int stat: min_flt + PIDS_FLT_MIN_C, // ul_int derived from stat: min_flt + cmin_flt + PIDS_FLT_MIN_DELTA, // s_int derived from FLT_MIN + PIDS_ID_EGID, // u_int status: Gid + PIDS_ID_EGROUP, // str derived from EGID, see getgrgid(3) + PIDS_ID_EUID, // u_int status: Uid + PIDS_ID_EUSER, // str derived from EUID, see getpwuid(3) + PIDS_ID_FGID, // u_int status: Gid + PIDS_ID_FGROUP, // str derived from FGID, see getgrgid(3) + PIDS_ID_FUID, // u_int status: Uid + PIDS_ID_FUSER, // str derived from FUID, see getpwuid(3) + PIDS_ID_LOGIN, // s_int loginuid + PIDS_ID_PGRP, // s_int stat: pgrp + PIDS_ID_PID, // s_int from /proc/<pid> + PIDS_ID_PPID, // s_int stat: ppid or status: PPid + PIDS_ID_RGID, // u_int status: Gid + PIDS_ID_RGROUP, // str derived from RGID, see getgrgid(3) + PIDS_ID_RUID, // u_int status: Uid + PIDS_ID_RUSER, // str derived from RUID, see getpwuid(3) + PIDS_ID_SESSION, // s_int stat: sid + PIDS_ID_SGID, // u_int status: Gid + PIDS_ID_SGROUP, // str derived from SGID, see getgrgid(3) + PIDS_ID_SUID, // u_int status: Uid + PIDS_ID_SUSER, // str derived from SUID, see getpwuid(3) + PIDS_ID_TGID, // s_int status: Tgid + PIDS_ID_TID, // s_int from /proc/<pid>/task/<tid> + PIDS_ID_TPGID, // s_int stat: tty_pgrp + PIDS_IO_READ_BYTES, // ul_int io: read_bytes + PIDS_IO_READ_CHARS, // ul_int io: rchar + PIDS_IO_READ_OPS, // ul_int io: syscr + PIDS_IO_WRITE_BYTES, // ul_int io: write_bytes + PIDS_IO_WRITE_CBYTES, // ul_int io: cancelled_write_bytes + PIDS_IO_WRITE_CHARS, // ul_int io: wchar + PIDS_IO_WRITE_OPS, // ul_int io: syscw + PIDS_LXCNAME, // str derived from CGROUP 'lxc.payload' + PIDS_MEM_CODE, // ul_int derived from MEM_CODE_PGS, as KiB + PIDS_MEM_CODE_PGS, // ul_int statm: trs + PIDS_MEM_DATA, // ul_int derived from MEM_DATA_PGS, as KiB + PIDS_MEM_DATA_PGS, // ul_int statm: drs + PIDS_MEM_RES, // ul_int derived from MEM_RES_PGS, as KiB + PIDS_MEM_RES_PGS, // ul_int statm: resident + PIDS_MEM_SHR, // ul_int derived from MEM_SHR_PGS, as KiB + PIDS_MEM_SHR_PGS, // ul_int statm: shared + PIDS_MEM_VIRT, // ul_int derived from MEM_VIRT_PGS, as KiB + PIDS_MEM_VIRT_PGS, // ul_int statm: size + PIDS_NICE, // s_int stat: nice + PIDS_NLWP, // s_int stat: num_threads or status: Threads + PIDS_NS_CGROUP, // ul_int ns/ + PIDS_NS_IPC, // ul_int " + PIDS_NS_MNT, // ul_int " + PIDS_NS_NET, // ul_int " + PIDS_NS_PID, // ul_int " + PIDS_NS_TIME, // ul_int " + PIDS_NS_USER, // ul_int " + PIDS_NS_UTS, // ul_int " + PIDS_OOM_ADJ, // s_int oom_score_adj + PIDS_OOM_SCORE, // s_int oom_score + PIDS_PRIORITY, // s_int stat: priority + PIDS_PRIORITY_RT, // s_int stat: rt_priority + PIDS_PROCESSOR, // s_int stat: task_cpu + PIDS_PROCESSOR_NODE, // s_int derived from PROCESSOR, see numa(3) + PIDS_RSS, // ul_int stat: rss + PIDS_RSS_RLIM, // ul_int stat: rsslim + PIDS_SCHED_CLASS, // s_int stat: policy + PIDS_SD_MACH, // str derived from PID/TID, see sd-login(3) + PIDS_SD_OUID, // str " + PIDS_SD_SEAT, // str " + PIDS_SD_SESS, // str " + PIDS_SD_SLICE, // str " + PIDS_SD_UNIT, // str " + PIDS_SD_UUNIT, // str " + PIDS_SIGBLOCKED, // str status: SigBlk + PIDS_SIGCATCH, // str status: SigCgt + PIDS_SIGIGNORE, // str status: SigIgn + PIDS_SIGNALS, // str status: ShdPnd + PIDS_SIGPENDING, // str status: SigPnd + PIDS_SMAP_ANONYMOUS, // ul_int smaps_rollup: Anonymous + PIDS_SMAP_HUGE_ANON, // ul_int smaps_rollup: AnonHugePages + PIDS_SMAP_HUGE_FILE, // ul_int smaps_rollup: FilePmdMapped + PIDS_SMAP_HUGE_SHMEM, // ul_int smaps_rollup: ShmemPmdMapped + PIDS_SMAP_HUGE_TLBPRV, // ul_int smaps_rollup: Private_Hugetlb + PIDS_SMAP_HUGE_TLBSHR, // ul_int smaps_rollup: Shared_Hugetlb + PIDS_SMAP_LAZY_FREE, // ul_int smaps_rollup: LazyFree + PIDS_SMAP_LOCKED, // ul_int smaps_rollup: Locked + PIDS_SMAP_PRV_CLEAN, // ul_int smaps_rollup: Private_Clean + PIDS_SMAP_PRV_DIRTY, // ul_int smaps_rollup: Private_Dirty + PIDS_SMAP_PRV_TOTAL, // ul_int derived from SMAP_PRV_CLEAN + SMAP_PRV_DIRTY + PIDS_SMAP_PSS, // ul_int smaps_rollup: Pss + PIDS_SMAP_PSS_ANON, // ul_int smaps_rollup: Pss_Anon + PIDS_SMAP_PSS_FILE, // ul_int smaps_rollup: Pss_File + PIDS_SMAP_PSS_SHMEM, // ul_int smaps_rollup: Pss_Shmem + PIDS_SMAP_REFERENCED, // ul_int smaps_rollup: Referenced + PIDS_SMAP_RSS, // ul_int smaps_rollup: Rss + PIDS_SMAP_SHR_CLEAN, // ul_int smaps_rollup: Shared_Clean + PIDS_SMAP_SHR_DIRTY, // ul_int smaps_rollup: Shared_Dirty + PIDS_SMAP_SWAP, // ul_int smaps_rollup: Swap + PIDS_SMAP_SWAP_PSS, // ul_int smaps_rollup: SwapPss + PIDS_STATE, // s_ch stat: state or status: State + PIDS_SUPGIDS, // str status: Groups + PIDS_SUPGROUPS, // str derived from SUPGIDS, see getgrgid(3) + PIDS_TICS_ALL, // ull_int derived from stat: stime + utime + PIDS_TICS_ALL_C, // ull_int derived from stat: stime + utime + cstime + cutime + PIDS_TICS_ALL_DELTA, // u_int derived from TICS_ALL + PIDS_TICS_BEGAN, // ull_int stat: start_time + PIDS_TICS_BLKIO, // ull_int stat: blkio_ticks + PIDS_TICS_GUEST, // ull_int stat: gtime + PIDS_TICS_GUEST_C, // ull_int derived from stat: gtime + cgtime + PIDS_TICS_SYSTEM, // ull_int stat: stime + PIDS_TICS_SYSTEM_C, // ull_int derived from stat: stime + cstime + PIDS_TICS_USER, // ull_int stat: utime + PIDS_TICS_USER_C, // ull_int derived from stat: utime + cutime + PIDS_TIME_ALL, // real * derived from stat: (utime + stime) / hertz + PIDS_TIME_ALL_C, // real * derived from stat: (utime + stime + cutime + cstime) / hertz + PIDS_TIME_ELAPSED, // real * derived from stat: (/proc/uptime - start_time) / hertz + PIDS_TIME_START, // real * derived from stat: start_time / hertz + PIDS_TTY, // s_int stat: tty_nr + PIDS_TTY_NAME, // str derived from TTY + PIDS_TTY_NUMBER, // str derived from TTY as str + PIDS_UTILIZATION, // real derived from TIME_ALL / TIME_ELAPSED, as percentage + PIDS_UTILIZATION_C, // real derived from TIME_ALL_C / TIME_ELAPSED, as percentage + PIDS_VM_DATA, // ul_int status: VmData + PIDS_VM_EXE, // ul_int status: VmExe + PIDS_VM_LIB, // ul_int status: VmLib + PIDS_VM_RSS, // ul_int status: VmRSS + PIDS_VM_RSS_ANON, // ul_int status: RssAnon + PIDS_VM_RSS_FILE, // ul_int status: RssFile + PIDS_VM_RSS_LOCKED, // ul_int status: VmLck + PIDS_VM_RSS_SHARED, // ul_int status: RssShmem + PIDS_VM_SIZE, // ul_int status: VmSize + PIDS_VM_STACK, // ul_int status: VmStk + PIDS_VM_SWAP, // ul_int status: VmSwap + PIDS_VM_USED, // ul_int derived from status: VmRSS + VmSwap + PIDS_VSIZE_BYTES, // ul_int stat: vsize + PIDS_WCHAN_NAME // str wchan +}; + // * while these are all expressed as seconds, each can be + // converted into tics/jiffies with no loss of precision + // when multiplied by hertz obtained via procps_misc(3). +enum pids_fetch_type { + PIDS_FETCH_TASKS_ONLY, + PIDS_FETCH_THREADS_TOO +}; + +enum pids_select_type { + PIDS_SELECT_PID = 0x10000, + PIDS_SELECT_PID_THREADS = 0x10001, + PIDS_SELECT_UID = 0x20000, + PIDS_SELECT_UID_THREADS = 0x20001 +}; + +enum pids_sort_order { + PIDS_SORT_ASCEND = +1, + PIDS_SORT_DESCEND = -1 +}; + + +struct pids_result { + enum pids_item item; + union { + signed char s_ch; + signed int s_int; + unsigned int u_int; + unsigned long ul_int; + unsigned long long ull_int; + char *str; + char **strv; + double real; + } result; +}; + +struct pids_stack { + struct pids_result *head; +}; + +struct pids_counts { + int total; + int running, sleeping, stopped, zombied, other; +}; + +struct pids_fetch { + struct pids_counts *counts; + struct pids_stack **stacks; +}; + +struct pids_info; + + +#define PIDS_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_pids_new (struct pids_info **info, enum pids_item *items, int numitems); +int procps_pids_ref (struct pids_info *info); +int procps_pids_unref (struct pids_info **info); + +struct pids_stack *fatal_proc_unmounted ( + struct pids_info *info, + int return_self); + +struct pids_stack *procps_pids_get ( + struct pids_info *info, + enum pids_fetch_type which); + +struct pids_fetch *procps_pids_reap ( + struct pids_info *info, + enum pids_fetch_type which); + +int procps_pids_reset ( + struct pids_info *info, + enum pids_item *newitems, + int newnumitems); + +struct pids_fetch *procps_pids_select ( + struct pids_info *info, + unsigned *these, + int numthese, + enum pids_select_type which); + +struct pids_stack **procps_pids_sort ( + struct pids_info *info, + struct pids_stack *stacks[], + int numstacked, + enum pids_item sortitem, + enum pids_sort_order order); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/procps-private.h b/library/include/procps-private.h new file mode 100644 index 0000000..835ea21 --- /dev/null +++ b/library/include/procps-private.h @@ -0,0 +1,28 @@ +/* + * libprocps - Library to read proc filesystem + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef PROCPS_PRIVATE_H +#define PROCPS_PRIVATE_H + +#define PROCPS_EXPORT __attribute__ ((visibility("default"))) + +#define STRINGIFY_ARG(a) #a +#define STRINGIFY(a) STRINGIFY_ARG(a) + +#define MAXTABLE(t) (int)(sizeof(t) / sizeof(t[0])) + +#endif diff --git a/library/include/pwcache.h b/library/include/pwcache.h new file mode 100644 index 0000000..524a2af --- /dev/null +++ b/library/include/pwcache.h @@ -0,0 +1,38 @@ +/* + * pwcache.c - memory cache passwd file handling + * + * Copyright © 2011-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * Copyright © 2002 Albert Cahalan + * + * Older version: + * Copyright © 1992-1998 Michael K. Johnson <johnsonm@redhat.com> + * Note: most likely none of his code remains + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_PROC_PWCACHE_H +#define PROCPS_PROC_PWCACHE_H + +#include <sys/types.h> + +// used in pwcache and in readproc to set size of username or groupname +#define P_G_SZ 33 + +char *pwcache_get_user(uid_t uid); +char *pwcache_get_group(gid_t gid); + +#endif diff --git a/library/include/readproc.h b/library/include/readproc.h new file mode 100644 index 0000000..33c630e --- /dev/null +++ b/library/include/readproc.h @@ -0,0 +1,303 @@ +/* + * readproc - interface to process table + * + * Copyright © 2002-2023 Craig Small <csmall@dropbear.xyz> + * Copyright © 2011-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 1998-2010 Albert Cahalan + * Copyright © 1998 Michael K. Johnson + * Copyright © 1996 Charles L. Blake. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_PROC_READPROC_H +#define PROCPS_PROC_READPROC_H + +#include <sys/types.h> +#include <dirent.h> +#include <unistd.h> +#include "misc.h" + +// the following is development only, forcing display of "[ duplicate ENUM ]" strings +// #define FALSE_THREADS /* set most child string fields to NULL */ + + +// This is to help document a transition from pid to tgid/tid caused +// by the introduction of thread support. It is used in cases where +// neither tgid nor tid seemed correct. (in other words, FIXME) +#define XXXID tid + +// Basic data structure which holds all information we can get about a process. +// (unless otherwise specified, fields are read from /proc/#/stat) +// +// Most of it comes from task_struct in linux/sched.h +// +typedef struct proc_t { + int + tid, // (special) task id, the POSIX thread ID (see also: tgid) + ppid; // stat,status pid of parent process + char + state, // stat,status single-char code for process state (S=sleeping) + pad_1, // n/a padding + pad_2, // n/a padding + pad_3; // n/a padding + unsigned long long + utime, // stat user-mode CPU time accumulated by process + stime, // stat kernel-mode CPU time accumulated by process + cutime, // stat cumulative utime of process and reaped children + cstime, // stat cumulative stime of process and reaped children + start_time, // stat start time of process -- seconds since system boot + blkio_tics, // stat time spent waiting for block IO + gtime, // stat guest time of the task in jiffies + cgtime; // stat guest time of the task children in jiffies + int // next 3 fields are NOT filled in by readproc + pcpu, // stat (special) elapsed tics for %CPU usage calculation + maj_delta, // stat (special) major page faults since last update + min_delta; // stat (special) minor page faults since last update + char + // Linux 2.1.7x and up have 64 signals. Allow 64, plus '\0' and padding. + signal[18], // status mask of pending signals + blocked[18], // status mask of blocked signals + sigignore[18], // status mask of ignored signals + sigcatch[18], // status mask of caught signals + _sigpnd[18]; // status mask of PER TASK pending signals + unsigned long + start_code, // stat address of beginning of code segment + end_code, // stat address of end of code segment + start_stack, // stat address of the bottom of stack for the process + kstk_esp, // stat kernel stack pointer + kstk_eip, // stat kernel instruction pointer + wchan, // stat (special) address of kernel wait channel proc is sleeping in + rss, // stat identical to 'resident' + alarm; // stat ? + int + priority, // stat kernel scheduling priority + nice; // stat standard unix nice level of process + unsigned long + // the next 7 members come from /proc/#/statm + size, // statm total virtual memory (as # pages) + resident, // statm resident non-swapped memory (as # pages) + share, // statm shared (mmap'd) memory (as # pages) + trs, // statm text (exe) resident set (as # pages) + lrs, // statm library resident set (always 0 w/ 2.6) + drs, // statm data+stack resident set (as # pages) + dt; // statm dirty pages (always 0 w/ 2.6) + unsigned long + vm_size, // status equals 'size' (as kb) + vm_lock, // status locked pages (as kb) + vm_rss, // status equals 'rss' and/or 'resident' (as kb) + vm_rss_anon, // status the 'anonymous' portion of vm_rss (as kb) + vm_rss_file, // status the 'file-backed' portion of vm_rss (as kb) + vm_rss_shared, // status the 'shared' portion of vm_rss (as kb) + vm_data, // status data only size (as kb) + vm_stack, // status stack only size (as kb) + vm_swap, // status based on linux-2.6.34 "swap ents" (as kb) + vm_exe, // status equals 'trs' (as kb) + vm_lib, // status total, not just used, library pages (as kb) + vsize, // stat number of pages of virtual memory ... + rss_rlim, // stat resident set size limit? + flags, // stat kernel flags for the process + min_flt, // stat number of minor page faults since process start + maj_flt, // stat number of major page faults since process start + cmin_flt, // stat cumulative min_flt of process and child processes + cmaj_flt, // stat cumulative maj_flt of process and child processes + rchar, // io characters read + wchar, // io characters written + syscr, // io number of read I/O operations + syscw, // io number of write I/O operations + read_bytes, // io number of bytes fetched from the storage layer + write_bytes, // io number of bytes sent to the storage layer + cancelled_write_bytes, // io number of bytes truncating pagecache + smap_Rss, // smaps_rollup mapping currently resident in RAM + smap_Pss, // " Rss divided by total processes sharing it + smap_Pss_Anon, // " proportional share of 'anonymous' memory + smap_Pss_File, // " proportional share of 'file' memory + smap_Pss_Shmem, // " proportional share of 'shmem' memory + smap_Shared_Clean, // " unmodified shared memory + smap_Shared_Dirty, // " altered shared memory + smap_Private_Clean, // " unmodified private memory + smap_Private_Dirty, // " altered private memory + smap_Referenced, // " memory marked as referenced/accessed + smap_Anonymous, // " memory not belonging to any file + smap_LazyFree, // " memory marked by madvise(MADV_FREE) + smap_AnonHugePages, // " memory backed by transparent huge pages + smap_ShmemPmdMapped, // " shmem/tmpfs memory backed by huge pages + smap_FilePmdMapped, // " file memory backed by huge pages + smap_Shared_Hugetlb, // " hugetlbfs backed memory *not* counted in Rss/Pss + smap_Private_Hugetlb, // " hugetlbfs backed memory *not* counted in Rss/Pss + smap_Swap, // " swapped would-be-anonymous memory (includes swapped out shmem) + smap_SwapPss, // " the proportional share of 'Swap' (excludes swapped out shmem) + smap_Locked; // " memory amount locked to RAM + char + *environ, // (special) environment as string (/proc/#/environ) + *cmdline, // (special) command line as string (/proc/#/cmdline) + *cgroup, // (special) cgroup as string (/proc/#/cgroup) + *cgname, // (special) name portion of above (if possible) + *supgid, // status supplementary gids as comma delimited str + *supgrp, // supp grp names as comma delimited str, derived from supgid + **environ_v, // (special) environment string vectors (/proc/#/environ) + **cmdline_v, // (special) command line string vectors (/proc/#/cmdline) + **cgroup_v; // (special) cgroup string vectors (/proc/#/cgroup) + char + *euser, // stat(),status effective user name + *ruser, // status real user name + *suser, // status saved user name + *fuser, // status filesystem user name + *rgroup, // status real group name + *egroup, // status effective group name + *sgroup, // status saved group name + *fgroup, // status filesystem group name + *cmd; // stat,status basename of executable file in call to exec(2) + int + rtprio, // stat real-time priority + sched, // stat scheduling class + pgrp, // stat process group id + session, // stat session id + nlwp, // stat,status number of threads, or 0 if no clue + tgid, // (special) thread group ID, the POSIX PID (see also: tid) + tty; // stat full device number of controlling terminal + /* FIXME: int uids & gids should be uid_t or gid_t from pwd.h */ + uid_t euid; gid_t egid; // stat(),status effective + uid_t ruid; gid_t rgid; // status real + uid_t suid; gid_t sgid; // status saved + uid_t fuid; gid_t fgid; // status fs (used for file access only) + int + tpgid, // stat terminal process group id + exit_signal, // stat might not be SIGCHLD + processor; // stat current (or most recent?) CPU + int + oom_score, // oom_score (badness for OOM killer) + oom_adj; // oom_adj (adjustment to OOM score) + struct procps_ns ns; // (ns subdir) inode number of namespaces + char + *sd_mach, // n/a systemd vm/container name + *sd_ouid, // n/a systemd session owner uid + *sd_seat, // n/a systemd login session seat + *sd_sess, // n/a systemd login session id + *sd_slice, // n/a systemd slice unit + *sd_unit, // n/a systemd system unit id + *sd_uunit; // n/a systemd user unit id + char + *lxcname, // n/a lxc container name + *exe; // exe executable path + name + int + luid, // loginuid user id at login + autogrp_id, // autogroup autogroup number (id) + autogrp_nice; // autogroup autogroup nice value +} proc_t; + +// PROCTAB: data structure holding the persistent information readproc needs +// from openproc(). The setup is intentionally similar to the dirent interface +// and other system table interfaces (utmp+wtmp come to mind). + +#define PROCPATHLEN 64 // must hold /proc/2000222000/task/2000222000/cmdline + +typedef struct PROCTAB { + DIR *procfs; +// char deBug0[64]; + DIR *taskdir; // for threads +// char deBug1[64]; + pid_t taskdir_user; // for threads + int(*finder)(struct PROCTAB *__restrict const, proc_t *__restrict const); + proc_t*(*reader)(struct PROCTAB *__restrict const, proc_t *__restrict const); + int(*taskfinder)(struct PROCTAB *__restrict const, const proc_t *__restrict const, proc_t *__restrict const, char *__restrict const); + proc_t*(*taskreader)(struct PROCTAB *__restrict const, proc_t *__restrict const, char *__restrict const); + pid_t *pids; // pids of the procs + uid_t *uids; // uids of procs + int nuid; // cannot really sentinel-terminate unsigned short[] + int i; // generic + int hide_kernel; // getenv LIBPROC_HIDE_KERNEL was set + unsigned flags; + unsigned u; // generic + void * vp; // generic + char path[PROCPATHLEN]; // must hold /proc/2000222000/task/2000222000/cmdline + unsigned pathlen; // length of string in the above (w/o '\0') +} PROCTAB; + + +// openproc/readproctab: +// +// Return PROCTAB* / *proc_t[] or NULL on error ((probably) "/proc" cannot be +// opened.) By default readproc will consider all processes as valid to parse +// and return, but not actually fill in the cmdline, environ, and /proc/#/statm +// derived memory fields. +// +// `flags' (a bitwise-or of PROC_* below) modifies the default behavior. The +// "fill" options will cause more of the proc_t to be filled in. The "filter" +// options all use the second argument as the pointer to a list of objects: +// process status', process id's, user id's. The third +// argument is the length of the list (currently only used for lists of user +// id's since uid_t supports no convenient termination sentinel.) + +#define PROC_FILLMEM 0x00000001 // read statm +#define PROC_FILLARG 0x00000002 // alloc and fill in `cmdline' vectors +#define PROC_FILLENV 0x00000004 // alloc and fill in `environ' vectors +#define PROC_FILLUSR 0x00000008 // resolve user id number -> user name +#define PROC_FILLGRP 0x00000010 // resolve group id number -> group name +#define PROC_FILLSTATUS 0x00000020 // read status +#define PROC_FILLSTAT 0x00000040 // read stat +#define PROC_FILLCGROUP 0x00000080 // alloc and fill in `cgroup` vectors +#define PROC_FILLOOM 0x00000100 // fill in proc_t oom_score and oom_adj +#define PROC_FILLNS 0x00000200 // fill in proc_t namespace information +#define PROC_FILLSYSTEMD 0x00000400 // fill in proc_t systemd information +#define PROC_FILL_LXC 0x00000800 // fill in proc_t lxcname, if possible +#define PROC_FILL_LUID 0x00001000 // fill in proc_t luid (login user id) +#define PROC_FILL_EXE 0x00002000 // fill in proc_t exe path + pgm name +#define PROC_FILLIO 0x00004000 // fill in proc_t io information +#define PROC_FILLSMAPS 0x00008000 // fill in proc_t smaps_rollup stuff + +// consider only processes with one of the passed: +#define PROC_PID 0x00010000 // process id numbers ( 0 terminated ) +#define PROC_UID 0x00020000 // user id numbers ( length needed ) +// Note: the above 2 values must NOT change without also changing pids.h !!! + +#define PROC_EDITCGRPCVT 0x00040000 // edit `cgroup' as regular string +#define PROC_EDITCMDLCVT 0x00080000 // edit `cmdline' as regular string +#define PROC_EDITENVRCVT 0x00100000 // edit `environ' as regular string + +// these three also require the PROC_FILLSTATUS flage +#define PROC_FILL_OUSERS ( 0x00200000 | PROC_FILLSTATUS ) // obtain other user names +#define PROC_FILL_OGROUPS ( 0x00400000 | PROC_FILLSTATUS ) // obtain other group names +#define PROC_FILL_SUPGRP ( 0x00800000 | PROC_FILLSTATUS ) // obtain supplementary group names + +// and let's put new flags here ... +#define PROC_FILLAUTOGRP 0x01000000 // fill in proc_t autogroup stuff + +// it helps to give app code a few spare bits +#define PROC_SPARE_1 0x10000000 +#define PROC_SPARE_2 0x20000000 +#define PROC_SPARE_3 0x40000000 +#define PROC_SPARE_4 0x80000000 + +// Function definitions +// Initialize a PROCTAB structure holding needed call-to-call persistent data +PROCTAB *openproc(unsigned flags, ... /* pid_t *| uid_t *| dev_t *| char *[, int n] */ ); +// Retrieve the next process or task matching the criteria set by the openproc(). +// +// Note: When NULL is used as the readproc 'p' or readeither 'x' +// parameter, the library will allocate the necessary proc_t storage. +// +// Alternatively, you may provide your own reuseable buffer address +// in which case that buffer *MUST* be initialized to zero one time +// only before first use. Thereafter, the library will manage such +// a passed proc_t, freeing any additional acquired memory associated +// with the previous process or thread. +proc_t *readproc(PROCTAB *__restrict const PT, proc_t *__restrict p); +proc_t *readeither(PROCTAB *__restrict const PT, proc_t *__restrict x); +int look_up_our_self(void); +void closeproc(PROCTAB *PT); +char **vectorize_this_str(const char *src); + +#endif diff --git a/library/include/slabinfo.h b/library/include/slabinfo.h new file mode 100644 index 0000000..f63ca79 --- /dev/null +++ b/library/include/slabinfo.h @@ -0,0 +1,140 @@ +/* + * slabinfo.h - slab pools related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_SLABINFO_H +#define PROCPS_SLABINFO_H + +#ifdef __cplusplus +extern "C "{ +#endif + +enum slabinfo_item { + SLABINFO_noop, // ( never altered ) + SLABINFO_extra, // ( reset to zero ) + // returns origin, see proc(5) + // ------- ------------------- + SLAB_NAME, // str /proc/slabinfo + SLAB_NUM_OBJS, // u_int " + SLAB_ACTIVE_OBJS, // u_int " + SLAB_OBJ_SIZE, // u_int " + SLAB_OBJ_PER_SLAB, // u_int " + SLAB_NUMS_SLABS, // u_int " + SLAB_ACTIVE_SLABS, // u_int " + SLAB_PAGES_PER_SLAB, // u_int " + SLAB_PERCENT_USED, // u_int derived from ACTIVE_OBJS / NUM_OBJS + SLAB_SIZE_TOTAL, // ul_int derived from page size * NUMS_SLABS * PAGES_PER_SLAB + + SLABS_CACHES_TOTAL, // u_int derived from all caches + SLABS_CACHES_ACTIVE, // u_int " + SLABS_NUM_OBJS, // u_int " + SLABS_ACTIVE_OBJS, // u_int " + SLABS_OBJ_SIZE_AVG, // u_int " + SLABS_OBJ_SIZE_MIN, // u_int " + SLABS_OBJ_SIZE_MAX, // u_int " + SLABS_NUMS_SLABS, // u_int " + SLABS_ACTIVE_SLABS, // u_int " + SLABS_PAGES_TOTAL, // u_int " + SLABS_SIZE_ACTIVE, // ul_int " + SLABS_SIZE_TOTAL, // ul_int " + + SLABS_DELTA_CACHES_TOTAL, // s_int derived from above + SLABS_DELTA_CACHES_ACTIVE, // s_int " + SLABS_DELTA_NUM_OBJS, // s_int " + SLABS_DELTA_ACTIVE_OBJS, // s_int " + SLABS_DELTA_OBJ_SIZE_AVG, // s_int " + SLABS_DELTA_OBJ_SIZE_MIN, // s_int " + SLABS_DELTA_OBJ_SIZE_MAX, // s_int " + SLABS_DELTA_NUMS_SLABS, // s_int " + SLABS_DELTA_ACTIVE_SLABS, // s_int " + SLABS_DELTA_PAGES_TOTAL, // s_int " + SLABS_DELTA_SIZE_ACTIVE, // s_int " + SLABS_DELTA_SIZE_TOTAL // s_int " +}; + +enum slabinfo_sort_order { + SLABINFO_SORT_ASCEND = +1, + SLABINFO_SORT_DESCEND = -1 +}; + + +struct slabinfo_result { + enum slabinfo_item item; + union { + signed int s_int; + unsigned int u_int; + unsigned long ul_int; + char *str; + } result; +}; + +struct slabinfo_stack { + struct slabinfo_result *head; +}; + +struct slabinfo_reaped { + int total; + struct slabinfo_stack **stacks; +}; + +struct slabinfo_info; + + +#define SLABINFO_GET( info, actual_enum, type ) ( { \ + struct slabinfo_result *r = procps_slabinfo_get( info, actual_enum ); \ + r ? r->result . type : 0; } ) + +#define SLABINFO_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_slabinfo_new (struct slabinfo_info **info); +int procps_slabinfo_ref (struct slabinfo_info *info); +int procps_slabinfo_unref (struct slabinfo_info **info); + +struct slabinfo_result *procps_slabinfo_get ( + struct slabinfo_info *info, + enum slabinfo_item item); + +struct slabinfo_reaped *procps_slabinfo_reap ( + struct slabinfo_info *info, + enum slabinfo_item *items, + int numitems); + +struct slabinfo_stack *procps_slabinfo_select ( + struct slabinfo_info *info, + enum slabinfo_item *items, + int numitems); + +struct slabinfo_stack **procps_slabinfo_sort ( + struct slabinfo_info *info, + struct slabinfo_stack *stacks[], + int numstacked, + enum slabinfo_item sortitem, + enum slabinfo_sort_order order); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/stat.h b/library/include/stat.h new file mode 100644 index 0000000..7adefa6 --- /dev/null +++ b/library/include/stat.h @@ -0,0 +1,175 @@ +/* + * stat.h - cpu/numa related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_STAT_H +#define PROCPS_STAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum stat_item { + STAT_noop, // ( never altered ) + STAT_extra, // ( reset to zero ) + // returns origin, see proc(5) + // ------- ------------------- + STAT_TIC_ID, // s_int /proc/stat, cpu or numa node id + STAT_TIC_ID_CORE, // s_int /proc/cpuinfo: 'core id', -1 = n/a + STAT_TIC_NUMA_NODE, // s_int [ CPU ID based, see: numa(3) ] + STAT_TIC_NUM_CONTRIBUTORS, // s_int [ total CPUs contributing to TIC counts ] + STAT_TIC_TYPE_CORE, // s_int [ 2 = P-core, 1 = E-core, 0 = n/a ] + + STAT_TIC_USER, // ull_int /proc/stat + STAT_TIC_NICE, // ull_int " + STAT_TIC_SYSTEM, // ull_int " + STAT_TIC_IDLE, // ull_int " + STAT_TIC_IOWAIT, // ull_int " + STAT_TIC_IRQ, // ull_int " + STAT_TIC_SOFTIRQ, // ull_int " + STAT_TIC_STOLEN, // ull_int " + STAT_TIC_GUEST, // ull_int " + STAT_TIC_GUEST_NICE, // ull_int " + + STAT_TIC_DELTA_USER, // sl_int derived from above + STAT_TIC_DELTA_NICE, // sl_int " + STAT_TIC_DELTA_SYSTEM, // sl_int " + STAT_TIC_DELTA_IDLE, // sl_int " + STAT_TIC_DELTA_IOWAIT, // sl_int " + STAT_TIC_DELTA_IRQ, // sl_int " + STAT_TIC_DELTA_SOFTIRQ, // sl_int " + STAT_TIC_DELTA_STOLEN, // sl_int " + STAT_TIC_DELTA_GUEST, // sl_int " + STAT_TIC_DELTA_GUEST_NICE, // sl_int " + + STAT_TIC_SUM_USER, // ull_int derived from USER + NICE tics + STAT_TIC_SUM_SYSTEM, // ull_int derived from SYSTEM + IRQ + SOFTIRQ tics + STAT_TIC_SUM_IDLE, // ull_int derived from IDLE + IOWAIT tics + STAT_TIC_SUM_BUSY, // ull_int derived from SUM_TOTAL - SUM_IDLE tics + STAT_TIC_SUM_TOTAL, // ull_int derived from sum of all 10 tics + + STAT_TIC_SUM_DELTA_USER, // sl_int derived from above + STAT_TIC_SUM_DELTA_SYSTEM, // sl_int " + STAT_TIC_SUM_DELTA_IDLE, // sl_int " + STAT_TIC_SUM_DELTA_BUSY, // sl_int " + STAT_TIC_SUM_DELTA_TOTAL, // sl_int " + + STAT_SYS_CTX_SWITCHES, // ul_int /proc/stat + STAT_SYS_INTERRUPTS, // ul_int " + STAT_SYS_PROC_BLOCKED, // ul_int " + STAT_SYS_PROC_CREATED, // ul_int " + STAT_SYS_PROC_RUNNING, // ul_int " + STAT_SYS_TIME_OF_BOOT, // ul_int " + + STAT_SYS_DELTA_CTX_SWITCHES, // s_int derived from above + STAT_SYS_DELTA_INTERRUPTS, // s_int " + STAT_SYS_DELTA_PROC_BLOCKED, // s_int " + STAT_SYS_DELTA_PROC_CREATED, // s_int " + STAT_SYS_DELTA_PROC_RUNNING // s_int " +}; + +enum stat_reap_type { + STAT_REAP_CPUS_ONLY, + STAT_REAP_NUMA_NODES_TOO +}; + +enum stat_sort_order { + STAT_SORT_ASCEND = +1, + STAT_SORT_DESCEND = -1 +}; + + +struct stat_result { + enum stat_item item; + union { + signed int s_int; + signed long sl_int; + unsigned long ul_int; + unsigned long long ull_int; + } result; +}; + +struct stat_stack { + struct stat_result *head; +}; + +struct stat_reap { + int total; + struct stat_stack **stacks; +}; + +struct stat_reaped { + struct stat_stack *summary; + struct stat_reap *cpus; + struct stat_reap *numa; +}; + +struct stat_info; + + + // STAT_TIC_ID value for /proc/stat cpu summary +#define STAT_SUMMARY_ID -11111 + // STAT_TIC_NUMA_NODE value for STAT_REAP_CPUS_ONLY or + // for STAT_REAP_NUMA_NODES_TOO when node was inactive +#define STAT_NODE_INVALID -22222 + + +#define STAT_GET( info, actual_enum, type ) ( { \ + struct stat_result *r = procps_stat_get( info, actual_enum ); \ + r ? r->result . type : 0; } ) + +#define STAT_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_stat_new (struct stat_info **info); +int procps_stat_ref (struct stat_info *info); +int procps_stat_unref (struct stat_info **info); + +struct stat_result *procps_stat_get ( + struct stat_info *info, + enum stat_item item); + +struct stat_reaped *procps_stat_reap ( + struct stat_info *info, + enum stat_reap_type what, + enum stat_item *items, + int numitems); + +struct stat_stack *procps_stat_select ( + struct stat_info *info, + enum stat_item *items, + int numitems); + +struct stat_stack **procps_stat_sort ( + struct stat_info *info, + struct stat_stack *stacks[], + int numstacked, + enum stat_item sortitem, + enum stat_sort_order order); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/vmstat.h b/library/include/vmstat.h new file mode 100644 index 0000000..9b94931 --- /dev/null +++ b/library/include/vmstat.h @@ -0,0 +1,382 @@ +/* + * vmstat.h - virtual memory related declarations for libproc2 + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 2015-2023 Craig Small <csmall@dropbear.xyz> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef PROCPS_VMSTAT_H +#define PROCPS_VMSTAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum vmstat_item { + VMSTAT_noop, // ( never altered ) + VMSTAT_extra, // ( reset to zero ) + // returns origin, see proc(5) + // ------- ------------------- + VMSTAT_ALLOCSTALL_DMA, // ul_int /proc/vmstat + VMSTAT_ALLOCSTALL_DMA32, // ul_int " + VMSTAT_ALLOCSTALL_HIGH, // ul_int " + VMSTAT_ALLOCSTALL_MOVABLE, // ul_int " + VMSTAT_ALLOCSTALL_NORMAL, // ul_int " + VMSTAT_BALLOON_DEFLATE, // ul_int " + VMSTAT_BALLOON_INFLATE, // ul_int " + VMSTAT_BALLOON_MIGRATE, // ul_int " + VMSTAT_COMPACT_DAEMON_FREE_SCANNED, // ul_int " + VMSTAT_COMPACT_DAEMON_MIGRATE_SCANNED, // ul_int " + VMSTAT_COMPACT_DAEMON_WAKE, // ul_int " + VMSTAT_COMPACT_FAIL, // ul_int " + VMSTAT_COMPACT_FREE_SCANNED, // ul_int " + VMSTAT_COMPACT_ISOLATED, // ul_int " + VMSTAT_COMPACT_MIGRATE_SCANNED, // ul_int " + VMSTAT_COMPACT_STALL, // ul_int " + VMSTAT_COMPACT_SUCCESS, // ul_int " + VMSTAT_DROP_PAGECACHE, // ul_int " + VMSTAT_DROP_SLAB, // ul_int " + VMSTAT_HTLB_BUDDY_ALLOC_FAIL, // ul_int " + VMSTAT_HTLB_BUDDY_ALLOC_SUCCESS, // ul_int " + VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY, // ul_int " + VMSTAT_KSWAPD_INODESTEAL, // ul_int " + VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY, // ul_int " + VMSTAT_NR_ACTIVE_ANON, // ul_int " + VMSTAT_NR_ACTIVE_FILE, // ul_int " + VMSTAT_NR_ANON_PAGES, // ul_int " + VMSTAT_NR_ANON_TRANSPARENT_HUGEPAGES, // ul_int " + VMSTAT_NR_BOUNCE, // ul_int " + VMSTAT_NR_DIRTIED, // ul_int " + VMSTAT_NR_DIRTY, // ul_int " + VMSTAT_NR_DIRTY_BACKGROUND_THRESHOLD, // ul_int " + VMSTAT_NR_DIRTY_THRESHOLD, // ul_int " + VMSTAT_NR_FILE_HUGEPAGES, // ul_int " + VMSTAT_NR_FILE_PAGES, // ul_int " + VMSTAT_NR_FILE_PMDMAPPED, // ul_int " + VMSTAT_NR_FOLL_PIN_ACQUIRED, // ul_int " + VMSTAT_NR_FOLL_PIN_RELEASED, // ul_int " + VMSTAT_NR_FREE_CMA, // ul_int " + VMSTAT_NR_FREE_PAGES, // ul_int " + VMSTAT_NR_INACTIVE_ANON, // ul_int " + VMSTAT_NR_INACTIVE_FILE, // ul_int " + VMSTAT_NR_ISOLATED_ANON, // ul_int " + VMSTAT_NR_ISOLATED_FILE, // ul_int " + VMSTAT_NR_KERNEL_MISC_RECLAIMABLE, // ul_int " + VMSTAT_NR_KERNEL_STACK, // ul_int " + VMSTAT_NR_MAPPED, // ul_int " + VMSTAT_NR_MLOCK, // ul_int " + VMSTAT_NR_PAGE_TABLE_PAGES, // ul_int " + VMSTAT_NR_SHADOW_CALL_STACK, // ul_int " + VMSTAT_NR_SHMEM, // ul_int " + VMSTAT_NR_SHMEM_HUGEPAGES, // ul_int " + VMSTAT_NR_SHMEM_PMDMAPPED, // ul_int " + VMSTAT_NR_SLAB_RECLAIMABLE, // ul_int " + VMSTAT_NR_SLAB_UNRECLAIMABLE, // ul_int " + VMSTAT_NR_UNEVICTABLE, // ul_int " + VMSTAT_NR_UNSTABLE, // ul_int " + VMSTAT_NR_VMSCAN_IMMEDIATE_RECLAIM, // ul_int " + VMSTAT_NR_VMSCAN_WRITE, // ul_int " + VMSTAT_NR_WRITEBACK, // ul_int " + VMSTAT_NR_WRITEBACK_TEMP, // ul_int " + VMSTAT_NR_WRITTEN, // ul_int " + VMSTAT_NR_ZONE_ACTIVE_ANON, // ul_int " + VMSTAT_NR_ZONE_ACTIVE_FILE, // ul_int " + VMSTAT_NR_ZONE_INACTIVE_ANON, // ul_int " + VMSTAT_NR_ZONE_INACTIVE_FILE, // ul_int " + VMSTAT_NR_ZONE_UNEVICTABLE, // ul_int " + VMSTAT_NR_ZONE_WRITE_PENDING, // ul_int " + VMSTAT_NR_ZSPAGES, // ul_int " + VMSTAT_NUMA_FOREIGN, // ul_int " + VMSTAT_NUMA_HINT_FAULTS, // ul_int " + VMSTAT_NUMA_HINT_FAULTS_LOCAL, // ul_int " + VMSTAT_NUMA_HIT, // ul_int " + VMSTAT_NUMA_HUGE_PTE_UPDATES, // ul_int " + VMSTAT_NUMA_INTERLEAVE, // ul_int " + VMSTAT_NUMA_LOCAL, // ul_int " + VMSTAT_NUMA_MISS, // ul_int " + VMSTAT_NUMA_OTHER, // ul_int " + VMSTAT_NUMA_PAGES_MIGRATED, // ul_int " + VMSTAT_NUMA_PTE_UPDATES, // ul_int " + VMSTAT_OOM_KILL, // ul_int " + VMSTAT_PAGEOUTRUN, // ul_int " + VMSTAT_PGACTIVATE, // ul_int " + VMSTAT_PGALLOC_DMA, // ul_int " + VMSTAT_PGALLOC_DMA32, // ul_int " + VMSTAT_PGALLOC_HIGH, // ul_int " + VMSTAT_PGALLOC_MOVABLE, // ul_int " + VMSTAT_PGALLOC_NORMAL, // ul_int " + VMSTAT_PGDEACTIVATE, // ul_int " + VMSTAT_PGFAULT, // ul_int " + VMSTAT_PGFREE, // ul_int " + VMSTAT_PGINODESTEAL, // ul_int " + VMSTAT_PGLAZYFREE, // ul_int " + VMSTAT_PGLAZYFREED, // ul_int " + VMSTAT_PGMAJFAULT, // ul_int " + VMSTAT_PGMIGRATE_FAIL, // ul_int " + VMSTAT_PGMIGRATE_SUCCESS, // ul_int " + VMSTAT_PGPGIN, // ul_int " + VMSTAT_PGPGOUT, // ul_int " + VMSTAT_PGREFILL, // ul_int " + VMSTAT_PGROTATED, // ul_int " + VMSTAT_PGSCAN_ANON, // ul_int " + VMSTAT_PGSCAN_DIRECT, // ul_int " + VMSTAT_PGSCAN_DIRECT_THROTTLE, // ul_int " + VMSTAT_PGSCAN_FILE, // ul_int " + VMSTAT_PGSCAN_KSWAPD, // ul_int " + VMSTAT_PGSKIP_DMA, // ul_int " + VMSTAT_PGSKIP_DMA32, // ul_int " + VMSTAT_PGSKIP_HIGH, // ul_int " + VMSTAT_PGSKIP_MOVABLE, // ul_int " + VMSTAT_PGSKIP_NORMAL, // ul_int " + VMSTAT_PGSTEAL_ANON, // ul_int " + VMSTAT_PGSTEAL_DIRECT, // ul_int " + VMSTAT_PGSTEAL_FILE, // ul_int " + VMSTAT_PGSTEAL_KSWAPD, // ul_int " + VMSTAT_PSWPIN, // ul_int " + VMSTAT_PSWPOUT, // ul_int " + VMSTAT_SLABS_SCANNED, // ul_int " + VMSTAT_SWAP_RA, // ul_int " + VMSTAT_SWAP_RA_HIT, // ul_int " + VMSTAT_THP_COLLAPSE_ALLOC, // ul_int " + VMSTAT_THP_COLLAPSE_ALLOC_FAILED, // ul_int " + VMSTAT_THP_DEFERRED_SPLIT_PAGE, // ul_int " + VMSTAT_THP_FAULT_ALLOC, // ul_int " + VMSTAT_THP_FAULT_FALLBACK, // ul_int " + VMSTAT_THP_FAULT_FALLBACK_CHARGE, // ul_int " + VMSTAT_THP_FILE_ALLOC, // ul_int " + VMSTAT_THP_FILE_FALLBACK, // ul_int " + VMSTAT_THP_FILE_FALLBACK_CHARGE, // ul_int " + VMSTAT_THP_FILE_MAPPED, // ul_int " + VMSTAT_THP_SPLIT_PAGE, // ul_int " + VMSTAT_THP_SPLIT_PAGE_FAILED, // ul_int " + VMSTAT_THP_SPLIT_PMD, // ul_int " + VMSTAT_THP_SPLIT_PUD, // ul_int " + VMSTAT_THP_SWPOUT, // ul_int " + VMSTAT_THP_SWPOUT_FALLBACK, // ul_int " + VMSTAT_THP_ZERO_PAGE_ALLOC, // ul_int " + VMSTAT_THP_ZERO_PAGE_ALLOC_FAILED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_CLEARED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_CULLED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_MLOCKED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_MUNLOCKED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_RESCUED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_SCANNED, // ul_int " + VMSTAT_UNEVICTABLE_PGS_STRANDED, // ul_int " + VMSTAT_WORKINGSET_ACTIVATE, // ul_int " + VMSTAT_WORKINGSET_NODERECLAIM, // ul_int " + VMSTAT_WORKINGSET_NODES, // ul_int " + VMSTAT_WORKINGSET_REFAULT, // ul_int " + VMSTAT_WORKINGSET_RESTORE, // ul_int " + VMSTAT_ZONE_RECLAIM_FAILED, // ul_int " + + VMSTAT_DELTA_ALLOCSTALL_DMA, // sl_int derived from above + VMSTAT_DELTA_ALLOCSTALL_DMA32, // sl_int " + VMSTAT_DELTA_ALLOCSTALL_HIGH, // sl_int " + VMSTAT_DELTA_ALLOCSTALL_MOVABLE, // sl_int " + VMSTAT_DELTA_ALLOCSTALL_NORMAL, // sl_int " + VMSTAT_DELTA_BALLOON_DEFLATE, // sl_int " + VMSTAT_DELTA_BALLOON_INFLATE, // sl_int " + VMSTAT_DELTA_BALLOON_MIGRATE, // sl_int " + VMSTAT_DELTA_COMPACT_DAEMON_FREE_SCANNED, // sl_int " + VMSTAT_DELTA_COMPACT_DAEMON_MIGRATE_SCANNED, // sl_int " + VMSTAT_DELTA_COMPACT_DAEMON_WAKE, // sl_int " + VMSTAT_DELTA_COMPACT_FAIL, // sl_int " + VMSTAT_DELTA_COMPACT_FREE_SCANNED, // sl_int " + VMSTAT_DELTA_COMPACT_ISOLATED, // sl_int " + VMSTAT_DELTA_COMPACT_MIGRATE_SCANNED, // sl_int " + VMSTAT_DELTA_COMPACT_STALL, // sl_int " + VMSTAT_DELTA_COMPACT_SUCCESS, // sl_int " + VMSTAT_DELTA_DROP_PAGECACHE, // sl_int " + VMSTAT_DELTA_DROP_SLAB, // sl_int " + VMSTAT_DELTA_HTLB_BUDDY_ALLOC_FAIL, // sl_int " + VMSTAT_DELTA_HTLB_BUDDY_ALLOC_SUCCESS, // sl_int " + VMSTAT_DELTA_KSWAPD_HIGH_WMARK_HIT_QUICKLY, // sl_int " + VMSTAT_DELTA_KSWAPD_INODESTEAL, // sl_int " + VMSTAT_DELTA_KSWAPD_LOW_WMARK_HIT_QUICKLY, // sl_int " + VMSTAT_DELTA_NR_ACTIVE_ANON, // sl_int " + VMSTAT_DELTA_NR_ACTIVE_FILE, // sl_int " + VMSTAT_DELTA_NR_ANON_PAGES, // sl_int " + VMSTAT_DELTA_NR_ANON_TRANSPARENT_HUGEPAGES, // sl_int " + VMSTAT_DELTA_NR_BOUNCE, // sl_int " + VMSTAT_DELTA_NR_DIRTIED, // sl_int " + VMSTAT_DELTA_NR_DIRTY, // sl_int " + VMSTAT_DELTA_NR_DIRTY_BACKGROUND_THRESHOLD, // sl_int " + VMSTAT_DELTA_NR_DIRTY_THRESHOLD, // sl_int " + VMSTAT_DELTA_NR_FILE_HUGEPAGES, // sl_int " + VMSTAT_DELTA_NR_FILE_PAGES, // sl_int " + VMSTAT_DELTA_NR_FILE_PMDMAPPED, // sl_int " + VMSTAT_DELTA_NR_FOLL_PIN_ACQUIRED, // sl_int " + VMSTAT_DELTA_NR_FOLL_PIN_RELEASED, // sl_int " + VMSTAT_DELTA_NR_FREE_CMA, // sl_int " + VMSTAT_DELTA_NR_FREE_PAGES, // sl_int " + VMSTAT_DELTA_NR_INACTIVE_ANON, // sl_int " + VMSTAT_DELTA_NR_INACTIVE_FILE, // sl_int " + VMSTAT_DELTA_NR_ISOLATED_ANON, // sl_int " + VMSTAT_DELTA_NR_ISOLATED_FILE, // sl_int " + VMSTAT_DELTA_NR_KERNEL_MISC_RECLAIMABLE, // sl_int " + VMSTAT_DELTA_NR_KERNEL_STACK, // sl_int " + VMSTAT_DELTA_NR_MAPPED, // sl_int " + VMSTAT_DELTA_NR_MLOCK, // sl_int " + VMSTAT_DELTA_NR_PAGE_TABLE_PAGES, // sl_int " + VMSTAT_DELTA_NR_SHADOW_CALL_STACK, // sl_int " + VMSTAT_DELTA_NR_SHMEM, // sl_int " + VMSTAT_DELTA_NR_SHMEM_HUGEPAGES, // sl_int " + VMSTAT_DELTA_NR_SHMEM_PMDMAPPED, // sl_int " + VMSTAT_DELTA_NR_SLAB_RECLAIMABLE, // sl_int " + VMSTAT_DELTA_NR_SLAB_UNRECLAIMABLE, // sl_int " + VMSTAT_DELTA_NR_UNEVICTABLE, // sl_int " + VMSTAT_DELTA_NR_UNSTABLE, // sl_int " + VMSTAT_DELTA_NR_VMSCAN_IMMEDIATE_RECLAIM, // sl_int " + VMSTAT_DELTA_NR_VMSCAN_WRITE, // sl_int " + VMSTAT_DELTA_NR_WRITEBACK, // sl_int " + VMSTAT_DELTA_NR_WRITEBACK_TEMP, // sl_int " + VMSTAT_DELTA_NR_WRITTEN, // sl_int " + VMSTAT_DELTA_NR_ZONE_ACTIVE_ANON, // sl_int " + VMSTAT_DELTA_NR_ZONE_ACTIVE_FILE, // sl_int " + VMSTAT_DELTA_NR_ZONE_INACTIVE_ANON, // sl_int " + VMSTAT_DELTA_NR_ZONE_INACTIVE_FILE, // sl_int " + VMSTAT_DELTA_NR_ZONE_UNEVICTABLE, // sl_int " + VMSTAT_DELTA_NR_ZONE_WRITE_PENDING, // sl_int " + VMSTAT_DELTA_NR_ZSPAGES, // sl_int " + VMSTAT_DELTA_NUMA_FOREIGN, // sl_int " + VMSTAT_DELTA_NUMA_HINT_FAULTS, // sl_int " + VMSTAT_DELTA_NUMA_HINT_FAULTS_LOCAL, // sl_int " + VMSTAT_DELTA_NUMA_HIT, // sl_int " + VMSTAT_DELTA_NUMA_HUGE_PTE_UPDATES, // sl_int " + VMSTAT_DELTA_NUMA_INTERLEAVE, // sl_int " + VMSTAT_DELTA_NUMA_LOCAL, // sl_int " + VMSTAT_DELTA_NUMA_MISS, // sl_int " + VMSTAT_DELTA_NUMA_OTHER, // sl_int " + VMSTAT_DELTA_NUMA_PAGES_MIGRATED, // sl_int " + VMSTAT_DELTA_NUMA_PTE_UPDATES, // sl_int " + VMSTAT_DELTA_OOM_KILL, // sl_int " + VMSTAT_DELTA_PAGEOUTRUN, // sl_int " + VMSTAT_DELTA_PGACTIVATE, // sl_int " + VMSTAT_DELTA_PGALLOC_DMA, // sl_int " + VMSTAT_DELTA_PGALLOC_DMA32, // sl_int " + VMSTAT_DELTA_PGALLOC_HIGH, // sl_int " + VMSTAT_DELTA_PGALLOC_MOVABLE, // sl_int " + VMSTAT_DELTA_PGALLOC_NORMAL, // sl_int " + VMSTAT_DELTA_PGDEACTIVATE, // sl_int " + VMSTAT_DELTA_PGFAULT, // sl_int " + VMSTAT_DELTA_PGFREE, // sl_int " + VMSTAT_DELTA_PGINODESTEAL, // sl_int " + VMSTAT_DELTA_PGLAZYFREE, // sl_int " + VMSTAT_DELTA_PGLAZYFREED, // sl_int " + VMSTAT_DELTA_PGMAJFAULT, // sl_int " + VMSTAT_DELTA_PGMIGRATE_FAIL, // sl_int " + VMSTAT_DELTA_PGMIGRATE_SUCCESS, // sl_int " + VMSTAT_DELTA_PGPGIN, // sl_int " + VMSTAT_DELTA_PGPGOUT, // sl_int " + VMSTAT_DELTA_PGREFILL, // sl_int " + VMSTAT_DELTA_PGROTATED, // sl_int " + VMSTAT_DELTA_PGSCAN_ANON, // sl_int " + VMSTAT_DELTA_PGSCAN_DIRECT, // sl_int " + VMSTAT_DELTA_PGSCAN_DIRECT_THROTTLE, // sl_int " + VMSTAT_DELTA_PGSCAN_FILE, // sl_int " + VMSTAT_DELTA_PGSCAN_KSWAPD, // sl_int " + VMSTAT_DELTA_PGSKIP_DMA, // sl_int " + VMSTAT_DELTA_PGSKIP_DMA32, // sl_int " + VMSTAT_DELTA_PGSKIP_HIGH, // sl_int " + VMSTAT_DELTA_PGSKIP_MOVABLE, // sl_int " + VMSTAT_DELTA_PGSKIP_NORMAL, // sl_int " + VMSTAT_DELTA_PGSTEAL_ANON, // sl_int " + VMSTAT_DELTA_PGSTEAL_DIRECT, // sl_int " + VMSTAT_DELTA_PGSTEAL_FILE, // sl_int " + VMSTAT_DELTA_PGSTEAL_KSWAPD, // sl_int " + VMSTAT_DELTA_PSWPIN, // sl_int " + VMSTAT_DELTA_PSWPOUT, // sl_int " + VMSTAT_DELTA_SLABS_SCANNED, // sl_int " + VMSTAT_DELTA_SWAP_RA, // sl_int " + VMSTAT_DELTA_SWAP_RA_HIT, // sl_int " + VMSTAT_DELTA_THP_COLLAPSE_ALLOC, // sl_int " + VMSTAT_DELTA_THP_COLLAPSE_ALLOC_FAILED, // sl_int " + VMSTAT_DELTA_THP_DEFERRED_SPLIT_PAGE, // sl_int " + VMSTAT_DELTA_THP_FAULT_ALLOC, // sl_int " + VMSTAT_DELTA_THP_FAULT_FALLBACK, // sl_int " + VMSTAT_DELTA_THP_FAULT_FALLBACK_CHARGE, // sl_int " + VMSTAT_DELTA_THP_FILE_ALLOC, // sl_int " + VMSTAT_DELTA_THP_FILE_FALLBACK, // sl_int " + VMSTAT_DELTA_THP_FILE_FALLBACK_CHARGE, // sl_int " + VMSTAT_DELTA_THP_FILE_MAPPED, // sl_int " + VMSTAT_DELTA_THP_SPLIT_PAGE, // sl_int " + VMSTAT_DELTA_THP_SPLIT_PAGE_FAILED, // sl_int " + VMSTAT_DELTA_THP_SPLIT_PMD, // sl_int " + VMSTAT_DELTA_THP_SPLIT_PUD, // sl_int " + VMSTAT_DELTA_THP_SWPOUT, // sl_int " + VMSTAT_DELTA_THP_SWPOUT_FALLBACK, // sl_int " + VMSTAT_DELTA_THP_ZERO_PAGE_ALLOC, // sl_int " + VMSTAT_DELTA_THP_ZERO_PAGE_ALLOC_FAILED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_CLEARED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_CULLED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_MLOCKED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_MUNLOCKED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_RESCUED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_SCANNED, // sl_int " + VMSTAT_DELTA_UNEVICTABLE_PGS_STRANDED, // sl_int " + VMSTAT_DELTA_WORKINGSET_ACTIVATE, // sl_int " + VMSTAT_DELTA_WORKINGSET_NODERECLAIM, // sl_int " + VMSTAT_DELTA_WORKINGSET_NODES, // sl_int " + VMSTAT_DELTA_WORKINGSET_REFAULT, // sl_int " + VMSTAT_DELTA_WORKINGSET_RESTORE, // sl_int " + VMSTAT_DELTA_ZONE_RECLAIM_FAILED // sl_int " +}; + + +struct vmstat_result { + enum vmstat_item item; + union { + signed long sl_int; + unsigned long ul_int; + } result; +}; + +struct vmstat_stack { + struct vmstat_result *head; +}; + +struct vmstat_info; + + +#define VMSTAT_GET( info, actual_enum, type ) ( { \ + struct vmstat_result *r = procps_vmstat_get( info, actual_enum ); \ + r ? r->result . type : 0; } ) + +#define VMSTAT_VAL( relative_enum, type, stack, info ) \ + stack -> head [ relative_enum ] . result . type + + +int procps_vmstat_new (struct vmstat_info **info); +int procps_vmstat_ref (struct vmstat_info *info); +int procps_vmstat_unref (struct vmstat_info **info); + +struct vmstat_result *procps_vmstat_get ( + struct vmstat_info *info, + enum vmstat_item item); + +struct vmstat_stack *procps_vmstat_select ( + struct vmstat_info *info, + enum vmstat_item *items, + int numitems); + + +#ifdef XTRA_PROCPS_DEBUG +# include "xtra-procps-debug.h" +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/library/include/wchan.h b/library/include/wchan.h new file mode 100644 index 0000000..ef1d689 --- /dev/null +++ b/library/include/wchan.h @@ -0,0 +1,27 @@ +/* + * wchan.c - kernel symbol handling + * + * Copyright © 2015-2023 Jim Warner <james.warner@comcast.net> + * Copyright © 1998-2003 Albert Cahalan + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PROCPS_PROC_WCHAN_H +#define PROCPS_PROC_WCHAN_H + +extern const char *lookup_wchan (int pid); + +#endif diff --git a/library/include/xtra-procps-debug.h b/library/include/xtra-procps-debug.h new file mode 100644 index 0000000..ead8075 --- /dev/null +++ b/library/include/xtra-procps-debug.h @@ -0,0 +1,208 @@ +/* + * libproc2 - Library to read proc filesystem + * + * Copyright © 2016-2023 Jim Warner <james.warner@comcast.net> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define STRINGIFY_ARG(a) #a +#define STRINGIFY(a) STRINGIFY_ARG(a) + + +// --- DISKSTATS ------------------------------------------ +#if defined(PROCPS_DISKSTATS_H) && !defined(PROCPS_DISKSTATS_H_DEBUG) +#define PROCPS_DISKSTATS_H_DEBUG + +struct diskstats_result *xtra_diskstats_get ( + struct diskstats_info *info, + const char *name, + enum diskstats_item actual_enum, + const char *typestr, + const char *file, + int lineno); + +# undef DISKSTATS_GET +#define DISKSTATS_GET( info, name, actual_enum, type ) ( { \ + struct diskstats_result *r; \ + r = xtra_diskstats_get(info, name, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) + +struct diskstats_result *xtra_diskstats_val ( + int relative_enum, + const char *typestr, + const struct diskstats_stack *stack, + struct diskstats_info *info, + const char *file, + int lineno); + +# undef DISKSTATS_VAL +#define DISKSTATS_VAL( relative_enum, type, stack, info ) ( { \ + struct diskstats_result *r; \ + r = xtra_diskstats_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . + + +// --- MEMINFO -------------------------------------------- +#if defined(PROCPS_MEMINFO_H) && !defined(PROCPS_MEMINFO_H_DEBUG) +#define PROCPS_MEMINFO_H_DEBUG + +struct meminfo_result *xtra_meminfo_get ( + struct meminfo_info *info, + enum meminfo_item actual_enum, + const char *typestr, + const char *file, + int lineno); + +# undef MEMINFO_GET +#define MEMINFO_GET( info, actual_enum, type ) ( { \ + struct meminfo_result *r; \ + r = xtra_meminfo_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) + +struct meminfo_result *xtra_meminfo_val ( + int relative_enum, + const char *typestr, + const struct meminfo_stack *stack, + struct meminfo_info *info, + const char *file, + int lineno); + +# undef MEMINFO_VAL +#define MEMINFO_VAL( relative_enum, type, stack, info ) ( { \ + struct meminfo_result *r; \ + r = xtra_meminfo_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . + + +// --- PIDS ----------------------------------------------- +#if defined(PROCPS_PIDS_H) && !defined(PROCPS_PIDS_H_DEBUG) +#define PROCPS_PIDS_H_DEBUG + +struct pids_result *xtra_pids_val ( + int relative_enum, + const char *typestr, + const struct pids_stack *stack, + struct pids_info *info, + const char *file, + int lineno); + +# undef PIDS_VAL +#define PIDS_VAL( relative_enum, type, stack, info ) ( { \ + struct pids_result *r; \ + r = xtra_pids_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . + + +// --- SLABINFO ------------------------------------------- +#if defined(PROCPS_SLABINFO_H) && !defined(PROCPS_SLABINFO_H_DEBUG) +#define PROCPS_SLABINFO_H_DEBUG + +struct slabinfo_result *xtra_slabinfo_get ( + struct slabinfo_info *info, + enum slabinfo_item actual_enum, + const char *typestr, + const char *file, + int lineno); + +# undef SLABINFO_GET +#define SLABINFO_GET( info, actual_enum, type ) ( { \ + struct slabinfo_result *r; \ + r = xtra_slabinfo_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) + +struct slabinfo_result *xtra_slabinfo_val ( + int relative_enum, + const char *typestr, + const struct slabinfo_stack *stack, + struct slabinfo_info *info, + const char *file, + int lineno); + +# undef SLABINFO_VAL +#define SLABINFO_VAL( relative_enum, type, stack, info ) ( { \ + struct slabinfo_result *r; \ + r = xtra_slabinfo_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . + + +// --- STAT ----------------------------------------------- +#if defined(PROCPS_STAT_H) && !defined(PROCPS_STAT_H_DEBUG) +#define PROCPS_STAT_H_DEBUG + +struct stat_result *xtra_stat_get ( + struct stat_info *info, + enum stat_item actual_enum, + const char *typestr, + const char *file, + int lineno); + +# undef STAT_GET +#define STAT_GET( info, actual_enum, type ) ( { \ + struct stat_result *r; \ + r = xtra_stat_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) + +struct stat_result *xtra_stat_val ( + int relative_enum, + const char *typestr, + const struct stat_stack *stack, + struct stat_info *info, + const char *file, + int lineno); + +# undef STAT_VAL +#define STAT_VAL( relative_enum, type, stack, info ) ( { \ + struct stat_result *r; \ + r = xtra_stat_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . + + +// --- VMSTAT --------------------------------------------- +#if defined(PROCPS_VMSTAT_H) && !defined(PROCPS_VMSTAT_H_DEBUG) +#define PROCPS_VMSTAT_H_DEBUG + +struct vmstat_result *xtra_vmstat_get ( + struct vmstat_info *info, + enum vmstat_item actual_enum, + const char *typestr, + const char *file, + int lineno); + +# undef VMSTAT_GET +#define VMSTAT_GET( info, actual_enum, type ) ( { \ + struct vmstat_result *r; \ + r = xtra_vmstat_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) + +struct vmstat_result *xtra_vmstat_val ( + int relative_enum, + const char *typestr, + const struct vmstat_stack *stack, + struct vmstat_info *info, + const char *file, + int lineno); + +# undef VMSTAT_VAL +#define VMSTAT_VAL( relative_enum, type, stack, info ) ( { \ + struct vmstat_result *r; \ + r = xtra_vmstat_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \ + r ? r->result . type : 0; } ) +#endif // . . . . . . . . . . |