/*
* pidstat: Display per-process statistics.
- * (C) 2007-2019 by Sebastien Godard (sysstat <at> orange.fr)
+ * (C) 2007-2021 by Sebastien Godard (sysstat <at> orange.fr)
*/
#ifndef _PIDSTAT_H
#define _PIDSTAT_H
/* sys/param.h defines HZ but needed for _POSIX_ARG_MAX and LOGIN_NAME_MAX */
#undef HZ
#endif
+#include "common.h"
#define K_SELF "SELF"
#define K_P_CHILD "CHILD"
#define K_P_ALL "ALL"
-#define NR_PID_PREALLOC 100
-
#ifdef _POSIX_ARG_MAX
#define MAX_COMM_LEN _POSIX_ARG_MAX
#define MAX_CMDLINE_LEN _POSIX_ARG_MAX
#define P_F_PROCSTR 0x0400
#define P_D_UNIT 0x0800
#define P_D_SEC_EPOCH 0x1000
+#define P_F_EXEC_PGM 0x2000
#define DISPLAY_PID(m) (((m) & P_D_PID) == P_D_PID)
#define DISPLAY_ALL_PID(m) (((m) & P_D_ALL_PID) == P_D_ALL_PID)
#define PROCESS_STRING(m) (((m) & P_F_PROCSTR) == P_F_PROCSTR)
#define DISPLAY_UNIT(m) (((m) & P_D_UNIT) == P_D_UNIT)
#define PRINT_SEC_EPOCH(m) (((m) & P_D_SEC_EPOCH) == P_D_SEC_EPOCH)
+#define EXEC_PGM(m) (((m) & P_F_EXEC_PGM) == P_F_EXEC_PGM)
/* Per-process flags */
#define F_NO_PID_IO 0x01
#define F_NO_PID_FD 0x02
+#define F_PID_DISPLAYED 0x04
#define NO_PID_IO(m) (((m) & F_NO_PID_IO) == F_NO_PID_IO)
#define NO_PID_FD(m) (((m) & F_NO_PID_FD) == F_NO_PID_FD)
+#define IS_PID_DISPLAYED(m) (((m) & F_PID_DISPLAYED) == F_PID_DISPLAYED)
-#define PROC "/proc"
+#define PROC PRE "/proc"
-#define PID_STAT "/proc/%u/stat"
-#define PID_STATUS "/proc/%u/status"
-#define PID_IO "/proc/%u/io"
-#define PID_CMDLINE "/proc/%u/cmdline"
-#define PID_SMAP "/proc/%u/smaps"
-#define PID_FD "/proc/%u/fd"
-#define PID_SCHED "/proc/%u/schedstat"
+#define PID_STAT PRE "/proc/%u/stat"
+#define PID_STATUS PRE "/proc/%u/status"
+#define PID_IO PRE "/proc/%u/io"
+#define PID_CMDLINE PRE "/proc/%u/cmdline"
+#define PID_SMAP PRE "/proc/%u/smaps"
+#define PID_FD PRE "/proc/%u/fd"
+#define PID_SCHED PRE "/proc/%u/schedstat"
-#define PROC_TASK "/proc/%u/task"
-#define TASK_STAT "/proc/%u/task/%u/stat"
-#define TASK_SCHED "/proc/%u/task/%u/schedstat"
-#define TASK_STATUS "/proc/%u/task/%u/status"
-#define TASK_IO "/proc/%u/task/%u/io"
-#define TASK_CMDLINE "/proc/%u/task/%u/cmdline"
-#define TASK_SMAP "/proc/%u/task/%u/smaps"
-#define TASK_FD "/proc/%u/task/%u/fd"
+#define PROC_TASK PRE "/proc/%u/task"
+#define TASK_STAT PRE "/proc/%u/task/%u/stat"
+#define TASK_SCHED PRE "/proc/%u/task/%u/schedstat"
+#define TASK_STATUS PRE "/proc/%u/task/%u/status"
+#define TASK_IO PRE "/proc/%u/task/%u/io"
+#define TASK_CMDLINE PRE "/proc/%u/task/%u/cmdline"
+#define TASK_SMAP PRE "/proc/%u/task/%u/smaps"
+#define TASK_FD PRE "/proc/%u/task/%u/fd"
#define PRINT_ID_HDR(_timestamp_, _flag_) do { \
printf("\n%-11s", _timestamp_); \
"?"))))))
struct pid_stats {
- unsigned long long read_bytes __attribute__ ((aligned (16)));
+ unsigned long long read_bytes __attribute__ ((aligned (8)));
unsigned long long write_bytes __attribute__ ((packed));
unsigned long long cancelled_write_bytes __attribute__ ((packed));
- unsigned long long total_vsz __attribute__ ((packed));
- unsigned long long total_rss __attribute__ ((packed));
- unsigned long long total_stack_size __attribute__ ((packed));
- unsigned long long total_stack_ref __attribute__ ((packed));
- unsigned long long total_threads __attribute__ ((packed));
- unsigned long long total_fd_nr __attribute__ ((packed));
unsigned long long blkio_swapin_delays __attribute__ ((packed));
unsigned long long minflt __attribute__ ((packed));
unsigned long long cminflt __attribute__ ((packed));
unsigned long nivcsw __attribute__ ((packed));
unsigned long stack_size __attribute__ ((packed));
unsigned long stack_ref __attribute__ ((packed));
- /* If pid is null, the process has terminated */
- unsigned int pid __attribute__ ((packed));
- /* If tgid is not null, then this PID is in fact a TID */
- unsigned int tgid __attribute__ ((packed));
- unsigned int rt_asum_count __attribute__ ((packed));
- unsigned int rc_asum_count __attribute__ ((packed));
- unsigned int uc_asum_count __attribute__ ((packed));
- unsigned int tf_asum_count __attribute__ ((packed));
- unsigned int sk_asum_count __attribute__ ((packed));
- unsigned int delay_asum_count __attribute__ ((packed));
unsigned int processor __attribute__ ((packed));
unsigned int priority __attribute__ ((packed));
unsigned int policy __attribute__ ((packed));
- unsigned int flags __attribute__ ((packed));
- unsigned int uid __attribute__ ((packed));
unsigned int threads __attribute__ ((packed));
unsigned int fd_nr __attribute__ ((packed));
- char comm[MAX_COMM_LEN];
- char cmdline[MAX_CMDLINE_LEN];
};
#define PID_STATS_SIZE (sizeof(struct pid_stats))
+struct st_pid {
+ unsigned long long total_vsz;
+ unsigned long long total_rss;
+ unsigned long long total_stack_size;
+ unsigned long long total_stack_ref;
+ unsigned long long total_threads;
+ unsigned long long total_fd_nr;
+ pid_t pid;
+ uid_t uid;
+ int exist; /* TRUE if PID exists */
+ unsigned int flags;
+ unsigned int rt_asum_count;
+ unsigned int rc_asum_count;
+ unsigned int uc_asum_count;
+ unsigned int tf_asum_count;
+ unsigned int sk_asum_count;
+ unsigned int delay_asum_count;
+ struct pid_stats *pstats[3];
+ struct st_pid *tgid; /* If current task is a TID, pointer to its TGID. NULL otherwise. */
+ struct st_pid *next;
+ char comm[MAX_COMM_LEN];
+ char cmdline[MAX_CMDLINE_LEN];
+};
+
#endif /* _PIDSTAT_H */