From c4aa6c0ab4263976b2abbc5df0068d5a1612d731 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Sun, 31 Jul 2016 00:00:00 -0500 Subject: [PATCH] library: normalize & minimize result types, api This commit attempts to minimize the variety of types currently used. Plus, the following were also changed: . the MEM fields were switched to parallel the VM guys . PIDS_MEM_VIRT -> PIDS_MEM_VIRT_PGS . PIDS_MEM_VIRT_KIB -> PIDS_MEM_VIRT . made NICE 's_int' so that it then parallels PRIORITY . change RTPRIO & SCHED_CLASS from 'ul_int' to 's_int' . removed Item_table 'oldflags' for an obsoleted field . PIDS_WCHAN_ADDR . added calculations like TICS_ALL_C for the following . PIDS_TICS_USER_C . PIDS_TICS_SYSTEM_C . these three new 'TICS' fields have been incorporated . PIDS_TICS_BLKIO - jiffies spent in block i/o . PIDS_TICS_GUEST - jiffies spent as a guest . PIDS_TICS_GUEST_C - as above, includes dead children . that PIDS_TICS_DELTA was renamed PIDS_TICS_ALL_DELTA ( so it did not hide between TICS_BLKIO & TICS_GUEST ) ( and to make clearer what's included: utime + stime ) . eliminated 'sl_int' entirely from that result struct [ often, the module changes necessitated that ] [ readproc header and source files had to change too ] Signed-off-by: Jim Warner --- proc/pids.c | 183 ++++++++++++++++++++++++------------------------ proc/pids.h | 76 ++++++++++---------- proc/readproc.c | 58 +++++++-------- proc/readproc.h | 38 +++++----- 4 files changed, 179 insertions(+), 176 deletions(-) diff --git a/proc/pids.c b/proc/pids.c index 1ad91194..9260a8ca 100644 --- a/proc/pids.c +++ b/proc/pids.c @@ -134,14 +134,14 @@ static char** vectorize_this (const char* src) { else R->result.strv = vectorize_this("[ duplicate " STRINGIFY(e) " ]"); } -setDECL(noop) { (void)I; (void)R; (void)P; return; } -setDECL(extra) { (void)I; (void)R; (void)P; return; } +setDECL(noop) { (void)I; (void)R; (void)P; return; } +setDECL(extra) { (void)I; (void)R; (void)P; return; } REG_set(ADDR_END_CODE, ul_int, end_code) REG_set(ADDR_KSTK_EIP, ul_int, kstk_eip) REG_set(ADDR_KSTK_ESP, ul_int, kstk_esp) REG_set(ADDR_START_CODE, ul_int, start_code) REG_set(ADDR_START_STACK, ul_int, start_stack) -REG_set(ALARM, sl_int, alarm) +REG_set(ALARM, ul_int, alarm) STR_set(CGNAME, cgname) STR_set(CGROUP, cgroup) VEC_set(CGROUP_V, cgroup_v) @@ -152,12 +152,12 @@ STR_set(ENVIRON, environ) VEC_set(ENVIRON_V, environ_v) REG_set(EXIT_SIGNAL, s_int, exit_signal) REG_set(FLAGS, ul_int, flags) -REG_set(FLT_MAJ, sl_int, maj_flt) -REG_set(FLT_MAJ_C, sl_int, cmaj_flt) -REG_set(FLT_MAJ_DELTA, sl_int, maj_delta) -REG_set(FLT_MIN, sl_int, min_flt) -REG_set(FLT_MIN_C, sl_int, cmin_flt) -REG_set(FLT_MIN_DELTA, sl_int, min_delta) +REG_set(FLT_MAJ, ul_int, maj_flt) +REG_set(FLT_MAJ_C, ul_int, cmaj_flt) +REG_set(FLT_MAJ_DELTA, s_int, maj_delta) +REG_set(FLT_MIN, ul_int, min_flt) +REG_set(FLT_MIN_C, ul_int, cmin_flt) +REG_set(FLT_MIN_DELTA, s_int, min_delta) REG_set(ID_EGID, u_int, egid) REG_set(ID_EGROUP, str, egroup) REG_set(ID_EUID, u_int, euid) @@ -181,19 +181,19 @@ REG_set(ID_SUSER, str, suser) REG_set(ID_TGID, s_int, tgid) REG_set(ID_TPGID, s_int, tpgid) REG_set(LXCNAME, str, lxcname) -REG_set(MEM_CODE, sl_int, trs) -CVT_set(MEM_CODE_KIB, sl_int, trs) -REG_set(MEM_DATA, sl_int, drs) -CVT_set(MEM_DATA_KIB, sl_int, drs) -REG_set(MEM_DT, sl_int, dt) -REG_set(MEM_LRS, sl_int, lrs) -REG_set(MEM_RES, sl_int, resident) -CVT_set(MEM_RES_KIB, sl_int, resident) -REG_set(MEM_SHR, sl_int, share) -CVT_set(MEM_SHR_KIB, ul_int, share) -REG_set(MEM_VIRT, sl_int, size) -CVT_set(MEM_VIRT_KIB, sl_int, size) -REG_set(NICE, sl_int, nice) +CVT_set(MEM_CODE, ul_int, trs) +REG_set(MEM_CODE_PGS, ul_int, trs) +CVT_set(MEM_DATA, ul_int, drs) +REG_set(MEM_DATA_PGS, ul_int, drs) +REG_set(MEM_DT_PGS, ul_int, dt) +REG_set(MEM_LRS_PGS, ul_int, lrs) +CVT_set(MEM_RES, ul_int, resident) +REG_set(MEM_RES_PGS, ul_int, resident) +CVT_set(MEM_SHR, ul_int, share) +REG_set(MEM_SHR_PGS, ul_int, share) +CVT_set(MEM_VIRT, ul_int, size) +REG_set(MEM_VIRT_PGS, ul_int, size) +REG_set(NICE, s_int, nice) REG_set(NLWP, s_int, nlwp) REG_set(NS_IPC, ul_int, ns.ns[0]) REG_set(NS_MNT, ul_int, ns.ns[1]) @@ -205,10 +205,10 @@ REG_set(OOM_ADJ, s_int, oom_adj) REG_set(OOM_SCORE, s_int, oom_score) REG_set(PRIORITY, s_int, priority) REG_set(PROCESSOR, u_int, processor) -REG_set(RSS, sl_int, rss) +REG_set(RSS, ul_int, rss) REG_set(RSS_RLIM, ul_int, rss_rlim) -REG_set(RTPRIO, ul_int, rtprio) -REG_set(SCHED_CLASS, ul_int, sched) +REG_set(RTPRIO, s_int, rtprio) +REG_set(SCHED_CLASS, s_int, sched) STR_set(SD_MACH, sd_mach) STR_set(SD_OUID, sd_ouid) STR_set(SD_SEAT, sd_seat) @@ -224,34 +224,37 @@ DUP_set(SIGPENDING, _sigpnd) REG_set(STATE, s_ch, state) STR_set(SUPGIDS, supgid) STR_set(SUPGROUPS, supgrp) -setDECL(TICS_ALL) { (void)I; R->result.ull_int = P->utime + P->stime; } -setDECL(TICS_ALL_C) { (void)I; R->result.ull_int = P->utime + P->stime + P->cutime + P->cstime; } -REG_set(TICS_DELTA, sl_int, pcpu) +setDECL(TICS_ALL) { (void)I; R->result.ull_int = P->utime + P->stime; } +setDECL(TICS_ALL_C) { (void)I; R->result.ull_int = P->utime + P->stime + P->cutime + P->cstime; } +REG_set(TICS_ALL_DELTA, s_int, pcpu) +REG_set(TICS_BLKIO, ull_int, blkio_tics) +REG_set(TICS_GUEST, ull_int, gtime) +setDECL(TICS_GUEST_C) { (void)I; R->result.ull_int = P->gtime + P->cgtime; } REG_set(TICS_SYSTEM, ull_int, stime) -REG_set(TICS_SYSTEM_C, ull_int, cstime) +setDECL(TICS_SYSTEM_C) { (void)I; R->result.ull_int = P->stime + P->cstime; } REG_set(TICS_USER, ull_int, utime) -REG_set(TICS_USER_C, ull_int, cutime) -setDECL(TIME_ALL) { R->result.ull_int = (P->utime + P->stime) / I->hertz; } -setDECL(TIME_ELAPSED) { R->result.ull_int = (I->boot_seconds >= (P->start_time / I->hertz)) ? I->boot_seconds - (P->start_time / I->hertz) : 0; } +setDECL(TICS_USER_C) { (void)I; R->result.ull_int = P->utime + P->cutime; } +setDECL(TIME_ALL) { R->result.ull_int = (P->utime + P->stime) / I->hertz; } +setDECL(TIME_ELAPSED) { unsigned long long t = P->start_time / I->hertz; R->result.ull_int = I->boot_seconds >= t ? (I->boot_seconds - t) : 0; } REG_set(TIME_START, ull_int, start_time) REG_set(TTY, s_int, tty) -setDECL(TTY_NAME) { char buf[64]; (void)I; dev_to_tty(buf, sizeof(buf), P->tty, P->tid, ABBREV_DEV); R->result.str = strdup(buf); } -setDECL(TTY_NUMBER) { char buf[64]; (void)I; dev_to_tty(buf, sizeof(buf), P->tty, P->tid, ABBREV_DEV|ABBREV_TTY|ABBREV_PTS); R->result.str = strdup(buf); } -REG_set(VM_DATA, sl_int, vm_data) -REG_set(VM_EXE, sl_int, vm_exe) -REG_set(VM_LIB, sl_int, vm_lib) -REG_set(VM_RSS, sl_int, vm_rss) -REG_set(VM_RSS_ANON, sl_int, vm_rss_anon) -REG_set(VM_RSS_FILE, sl_int, vm_rss_file) -REG_set(VM_RSS_LOCKED, sl_int, vm_lock) -REG_set(VM_RSS_SHARED, sl_int, vm_rss_shared) -REG_set(VM_SIZE, sl_int, vm_size) -REG_set(VM_STACK, sl_int, vm_stack) -REG_set(VM_SWAP, sl_int, vm_swap) -setDECL(VM_USED) { (void)I; R->result.sl_int = P->vm_swap + P->vm_rss; } +setDECL(TTY_NAME) { char buf[64]; (void)I; dev_to_tty(buf, sizeof(buf), P->tty, P->tid, ABBREV_DEV); R->result.str = strdup(buf); } +setDECL(TTY_NUMBER) { char buf[64]; (void)I; dev_to_tty(buf, sizeof(buf), P->tty, P->tid, ABBREV_DEV|ABBREV_TTY|ABBREV_PTS); R->result.str = strdup(buf); } +REG_set(VM_DATA, ul_int, vm_data) +REG_set(VM_EXE, ul_int, vm_exe) +REG_set(VM_LIB, ul_int, vm_lib) +REG_set(VM_RSS, ul_int, vm_rss) +REG_set(VM_RSS_ANON, ul_int, vm_rss_anon) +REG_set(VM_RSS_FILE, ul_int, vm_rss_file) +REG_set(VM_RSS_LOCKED, ul_int, vm_lock) +REG_set(VM_RSS_SHARED, ul_int, vm_rss_shared) +REG_set(VM_SIZE, ul_int, vm_size) +REG_set(VM_STACK, ul_int, vm_stack) +REG_set(VM_SWAP, ul_int, vm_swap) +setDECL(VM_USED) { (void)I; R->result.ul_int = P->vm_swap + P->vm_rss; } REG_set(VSIZE_PGS, ul_int, vsize) REG_set(WCHAN_ADDR, ul_int, wchan) -setDECL(WCHAN_NAME) { (void)I; R->result.str = strdup(lookup_wchan(P->tid)); } +setDECL(WCHAN_NAME) { (void)I; R->result.str = strdup(lookup_wchan(P->tid)); } #undef setDECL #undef CVT_set @@ -299,7 +302,6 @@ struct sort_parms { NUM_srt(s_ch) NUM_srt(s_int) -NUM_srt(sl_int) REG_srt(u_int) REG_srt(ul_int) @@ -389,7 +391,7 @@ static struct { { RS(ADDR_KSTK_ESP), f_stat, NULL, QS(ul_int), 0 }, { RS(ADDR_START_CODE), f_stat, NULL, QS(ul_int), 0 }, { RS(ADDR_START_STACK), f_stat, NULL, QS(ul_int), 0 }, - { RS(ALARM), f_stat, NULL, QS(sl_int), 0 }, + { RS(ALARM), f_stat, NULL, QS(ul_int), 0 }, { RS(CGNAME), x_cgroup, FF(str), QS(str), 0 }, { RS(CGROUP), x_cgroup, FF(str), QS(str), 0 }, { RS(CGROUP_V), v_cgroup, FF(strv), QS(strv), 0 }, @@ -400,12 +402,12 @@ static struct { { RS(ENVIRON_V), v_env, FF(strv), QS(strv), 0 }, { RS(EXIT_SIGNAL), f_stat, NULL, QS(s_int), 0 }, { RS(FLAGS), f_stat, NULL, QS(ul_int), 0 }, - { RS(FLT_MAJ), f_stat, NULL, QS(sl_int), 0 }, - { RS(FLT_MAJ_C), f_stat, NULL, QS(sl_int), 0 }, - { RS(FLT_MAJ_DELTA), f_stat, NULL, QS(sl_int), +1 }, - { RS(FLT_MIN), f_stat, NULL, QS(sl_int), 0 }, - { RS(FLT_MIN_C), f_stat, NULL, QS(sl_int), 0 }, - { RS(FLT_MIN_DELTA), f_stat, NULL, QS(sl_int), +1 }, + { RS(FLT_MAJ), f_stat, NULL, QS(ul_int), 0 }, + { RS(FLT_MAJ_C), f_stat, NULL, QS(ul_int), 0 }, + { RS(FLT_MAJ_DELTA), f_stat, NULL, QS(s_int), +1 }, + { RS(FLT_MIN), f_stat, NULL, QS(ul_int), 0 }, + { RS(FLT_MIN_C), f_stat, NULL, QS(ul_int), 0 }, + { RS(FLT_MIN_DELTA), f_stat, NULL, QS(s_int), +1 }, { RS(ID_EGID), 0, NULL, QS(u_int), 0 }, // oldflags: free w/ simple_read { RS(ID_EGROUP), f_grp, NULL, QS(str), 0 }, { RS(ID_EUID), 0, NULL, QS(u_int), 0 }, // oldflags: free w/ simple_read @@ -429,19 +431,19 @@ static struct { { RS(ID_TGID), 0, NULL, QS(s_int), 0 }, // oldflags: free w/ simple_nextpid { RS(ID_TPGID), f_stat, NULL, QS(s_int), 0 }, { RS(LXCNAME), f_lxc, NULL, QS(str), 0 }, // freefunc NULL w/ cached string - { RS(MEM_CODE), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_CODE_KIB), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_DATA), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_DATA_KIB), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_DT), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_LRS), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_RES), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_RES_KIB), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_SHR), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_SHR_KIB), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_VIRT), f_statm, NULL, QS(sl_int), 0 }, - { RS(MEM_VIRT_KIB), f_statm, NULL, QS(sl_int), 0 }, - { RS(NICE), f_stat, NULL, QS(sl_int), 0 }, + { RS(MEM_CODE), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_CODE_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_DATA), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_DATA_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_DT_PGS), f_statm, NULL, QS(ul_int), 0 }, // ( always 0 w/ since 2.6 ) + { RS(MEM_LRS_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_RES), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_RES_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_SHR), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_SHR_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_VIRT), f_statm, NULL, QS(ul_int), 0 }, + { RS(MEM_VIRT_PGS), f_statm, NULL, QS(ul_int), 0 }, + { RS(NICE), f_stat, NULL, QS(s_int), 0 }, { RS(NLWP), f_either, NULL, QS(s_int), 0 }, { RS(NS_IPC), f_ns, NULL, QS(ul_int), 0 }, { RS(NS_MNT), f_ns, NULL, QS(ul_int), 0 }, @@ -453,10 +455,10 @@ static struct { { RS(OOM_SCORE), f_oom, NULL, QS(s_int), 0 }, { RS(PRIORITY), f_stat, NULL, QS(s_int), 0 }, { RS(PROCESSOR), f_stat, NULL, QS(u_int), 0 }, - { RS(RSS), f_stat, NULL, QS(sl_int), 0 }, + { RS(RSS), f_stat, NULL, QS(ul_int), 0 }, { RS(RSS_RLIM), f_stat, NULL, QS(ul_int), 0 }, - { RS(RTPRIO), f_stat, NULL, QS(ul_int), 0 }, - { RS(SCHED_CLASS), f_stat, NULL, QS(ul_int), 0 }, + { RS(RTPRIO), f_stat, NULL, QS(s_int), 0 }, + { RS(SCHED_CLASS), f_stat, NULL, QS(s_int), 0 }, { RS(SD_MACH), f_systemd, FF(str), QS(str), 0 }, { RS(SD_OUID), f_systemd, FF(str), QS(str), 0 }, { RS(SD_SEAT), f_systemd, FF(str), QS(str), 0 }, @@ -474,7 +476,10 @@ static struct { { RS(SUPGROUPS), x_supgrp, FF(str), QS(str), 0 }, { RS(TICS_ALL), f_stat, NULL, QS(ull_int), 0 }, { RS(TICS_ALL_C), f_stat, NULL, QS(ull_int), 0 }, - { RS(TICS_DELTA), f_stat, NULL, QS(sl_int), +1 }, + { RS(TICS_ALL_DELTA), f_stat, NULL, QS(s_int), +1 }, + { RS(TICS_BLKIO), f_stat, NULL, QS(ull_int), 0 }, + { RS(TICS_GUEST), f_stat, NULL, QS(ull_int), 0 }, + { RS(TICS_GUEST_C), f_stat, NULL, QS(ull_int), 0 }, { RS(TICS_SYSTEM), f_stat, NULL, QS(ull_int), 0 }, { RS(TICS_SYSTEM_C), f_stat, NULL, QS(ull_int), 0 }, { RS(TICS_USER), f_stat, NULL, QS(ull_int), 0 }, @@ -485,20 +490,20 @@ static struct { { RS(TTY), f_stat, NULL, QS(s_int), 0 }, { RS(TTY_NAME), f_stat, FF(str), QS(strvers), 0 }, { RS(TTY_NUMBER), f_stat, FF(str), QS(strvers), 0 }, - { RS(VM_DATA), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_EXE), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_LIB), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_RSS), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_RSS_ANON), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_RSS_FILE), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_RSS_LOCKED), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_RSS_SHARED), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_SIZE), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_STACK), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_SWAP), f_status, NULL, QS(sl_int), 0 }, - { RS(VM_USED), f_status, NULL, QS(sl_int), 0 }, + { RS(VM_DATA), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_EXE), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_LIB), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_RSS), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_RSS_ANON), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_RSS_FILE), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_RSS_LOCKED), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_RSS_SHARED), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_SIZE), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_STACK), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_SWAP), f_status, NULL, QS(ul_int), 0 }, + { RS(VM_USED), f_status, NULL, QS(ul_int), 0 }, { RS(VSIZE_PGS), f_stat, NULL, QS(ul_int), 0 }, - { RS(WCHAN_ADDR), f_stat, NULL, QS(ul_int), 0 }, + { RS(WCHAN_ADDR), 0, NULL, QS(ul_int), 0 }, // oldflags: was f_stat, but linux obsoleted { RS(WCHAN_NAME), 0, FF(str), QS(str), 0 }, // oldflags: tid already free // dummy entry corresponding to PIDS_logical_end ... @@ -549,7 +554,7 @@ typedef unsigned long long TIC_t; typedef struct HST_t { TIC_t tics; // last frame's tics count - long maj, min; // last frame's maj/min_flt counts + unsigned long maj, min; // last frame's maj/min_flt counts int pid; // record 'key' int lnk; // next on hash chain } HST_t; @@ -626,15 +631,14 @@ static int make_hist ( return -ENOMEM; } Hr(PHist_new[nSLOT].pid) = p->tid; - Hr(PHist_new[nSLOT].tics) = tics = (p->utime + p->stime); Hr(PHist_new[nSLOT].maj) = p->maj_flt; Hr(PHist_new[nSLOT].min) = p->min_flt; + Hr(PHist_new[nSLOT].tics) = tics = (p->utime + p->stime); histput(info, nSLOT); if ((h = histget(info, p->tid))) { - tics -= h->tics; - p->pcpu = tics; + p->pcpu = tics - h->tics; p->maj_delta = p->maj_flt - h->maj; p->min_delta = p->min_flt - h->min; } @@ -939,7 +943,6 @@ static inline int oldproc_open ( unsigned flags, ...) { - va_list vl; int *ids; int num = 0; diff --git a/proc/pids.h b/proc/pids.h index 5b58e2b5..0b27f847 100644 --- a/proc/pids.h +++ b/proc/pids.h @@ -35,7 +35,7 @@ enum pids_item { PIDS_ADDR_KSTK_ESP, // ul_int PIDS_ADDR_START_CODE, // ul_int PIDS_ADDR_START_STACK, // ul_int - PIDS_ALARM, // sl_int + PIDS_ALARM, // ul_int PIDS_CGNAME, // str PIDS_CGROUP, // str PIDS_CGROUP_V, // strv @@ -46,12 +46,12 @@ enum pids_item { PIDS_ENVIRON_V, // strv PIDS_EXIT_SIGNAL, // s_int PIDS_FLAGS, // ul_int - PIDS_FLT_MAJ, // sl_int - PIDS_FLT_MAJ_C, // sl_int - PIDS_FLT_MAJ_DELTA, // sl_int - PIDS_FLT_MIN, // sl_int - PIDS_FLT_MIN_C, // sl_int - PIDS_FLT_MIN_DELTA, // sl_int + PIDS_FLT_MAJ, // ul_int + PIDS_FLT_MAJ_C, // ul_int + PIDS_FLT_MAJ_DELTA, // s_int + PIDS_FLT_MIN, // ul_int + PIDS_FLT_MIN_C, // ul_int + PIDS_FLT_MIN_DELTA, // s_int PIDS_ID_EGID, // u_int PIDS_ID_EGROUP, // str PIDS_ID_EUID, // u_int @@ -75,19 +75,19 @@ enum pids_item { PIDS_ID_TGID, // s_int PIDS_ID_TPGID, // s_int PIDS_LXCNAME, // str - PIDS_MEM_CODE, // sl_int - PIDS_MEM_CODE_KIB, // sl_int - PIDS_MEM_DATA, // sl_int - PIDS_MEM_DATA_KIB, // sl_int - PIDS_MEM_DT, // sl_int - PIDS_MEM_LRS, // sl_int - PIDS_MEM_RES, // sl_int - PIDS_MEM_RES_KIB, // sl_int - PIDS_MEM_SHR, // sl_int - PIDS_MEM_SHR_KIB, // sl_int - PIDS_MEM_VIRT, // sl_int - PIDS_MEM_VIRT_KIB, // sl_int - PIDS_NICE, // sl_int + PIDS_MEM_CODE, // ul_int + PIDS_MEM_CODE_PGS, // ul_int + PIDS_MEM_DATA, // ul_int + PIDS_MEM_DATA_PGS, // ul_int + PIDS_MEM_DT_PGS, // ul_int + PIDS_MEM_LRS_PGS, // ul_int + PIDS_MEM_RES, // ul_int + PIDS_MEM_RES_PGS, // ul_int + PIDS_MEM_SHR, // ul_int + PIDS_MEM_SHR_PGS, // ul_int + PIDS_MEM_VIRT, // ul_int + PIDS_MEM_VIRT_PGS, // ul_int + PIDS_NICE, // s_int PIDS_NLWP, // s_int PIDS_NS_IPC, // ul_int PIDS_NS_MNT, // ul_int @@ -99,10 +99,10 @@ enum pids_item { PIDS_OOM_SCORE, // s_int PIDS_PRIORITY, // s_int PIDS_PROCESSOR, // u_int - PIDS_RSS, // sl_int + PIDS_RSS, // ul_int PIDS_RSS_RLIM, // ul_int - PIDS_RTPRIO, // ul_int - PIDS_SCHED_CLASS, // ul_int + PIDS_RTPRIO, // s_int + PIDS_SCHED_CLASS, // s_int PIDS_SD_MACH, // str PIDS_SD_OUID, // str PIDS_SD_SEAT, // str @@ -120,7 +120,10 @@ enum pids_item { PIDS_SUPGROUPS, // str PIDS_TICS_ALL, // ull_int PIDS_TICS_ALL_C, // ull_int - PIDS_TICS_DELTA, // sl_int + PIDS_TICS_ALL_DELTA, // s_int + PIDS_TICS_BLKIO, // ull_int + PIDS_TICS_GUEST, // ull_int + PIDS_TICS_GUEST_C, // ull_int PIDS_TICS_SYSTEM, // ull_int PIDS_TICS_SYSTEM_C, // ull_int PIDS_TICS_USER, // ull_int @@ -131,18 +134,18 @@ enum pids_item { PIDS_TTY, // s_int PIDS_TTY_NAME, // str PIDS_TTY_NUMBER, // str - PIDS_VM_DATA, // sl_int - PIDS_VM_EXE, // sl_int - PIDS_VM_LIB, // sl_int - PIDS_VM_RSS, // sl_int - PIDS_VM_RSS_ANON, // sl_int - PIDS_VM_RSS_FILE, // sl_int - PIDS_VM_RSS_LOCKED, // sl_int - PIDS_VM_RSS_SHARED, // sl_int - PIDS_VM_SIZE, // sl_int - PIDS_VM_STACK, // sl_int - PIDS_VM_SWAP, // sl_int - PIDS_VM_USED, // sl_int + PIDS_VM_DATA, // ul_int + PIDS_VM_EXE, // ul_int + PIDS_VM_LIB, // ul_int + PIDS_VM_RSS, // ul_int + PIDS_VM_RSS_ANON, // ul_int + PIDS_VM_RSS_FILE, // ul_int + PIDS_VM_RSS_LOCKED, // ul_int + PIDS_VM_RSS_SHARED, // ul_int + PIDS_VM_SIZE, // ul_int + PIDS_VM_STACK, // ul_int + PIDS_VM_SWAP, // ul_int + PIDS_VM_USED, // ul_int PIDS_VSIZE_PGS, // ul_int PIDS_WCHAN_ADDR, // ul_int PIDS_WCHAN_NAME // str @@ -170,7 +173,6 @@ struct pids_result { signed char s_ch; signed int s_int; unsigned int u_int; - signed long sl_int; unsigned long ul_int; unsigned long long ull_int; char *str; diff --git a/proc/readproc.c b/proc/readproc.c index 45169f45..a79be990 100644 --- a/proc/readproc.c +++ b/proc/readproc.c @@ -350,37 +350,37 @@ ENTER(0x220); P->fgid = strtol(S,&S,10); continue; case_VmData: - P->vm_data = strtol(S,&S,10); + P->vm_data = (unsigned long)strtol(S,&S,10); continue; case_VmExe: - P->vm_exe = strtol(S,&S,10); + P->vm_exe = (unsigned long)strtol(S,&S,10); continue; case_VmLck: - P->vm_lock = strtol(S,&S,10); + P->vm_lock = (unsigned long)strtol(S,&S,10); continue; case_VmLib: - P->vm_lib = strtol(S,&S,10); + P->vm_lib = (unsigned long)strtol(S,&S,10); continue; case_VmRSS: - P->vm_rss = strtol(S,&S,10); + P->vm_rss = (unsigned long)strtol(S,&S,10); continue; case_RssAnon: // subset of VmRSS, linux-4.5 - P->vm_rss_anon = strtol(S,&S,10); + P->vm_rss_anon = (unsigned long)strtol(S,&S,10); continue; case_RssFile: // subset of VmRSS, linux-4.5 - P->vm_rss_file = strtol(S,&S,10); + P->vm_rss_file = (unsigned long)strtol(S,&S,10); continue; case_RssShmem: // subset of VmRSS, linux-4.5 - P->vm_rss_shared = strtol(S,&S,10); + P->vm_rss_shared = (unsigned long)strtol(S,&S,10); continue; case_VmSize: - P->vm_size = strtol(S,&S,10); + P->vm_size = (unsigned long)strtol(S,&S,10); continue; case_VmStk: - P->vm_stack = strtol(S,&S,10); + P->vm_stack = (unsigned long)strtol(S,&S,10); continue; case_VmSwap: // Linux 2.6.34 - P->vm_swap = strtol(S,&S,10); + P->vm_swap = (unsigned long)strtol(S,&S,10); continue; case_Groups: { char *nl = strchr(S, '\n'); @@ -551,21 +551,22 @@ ENTER(0x160); S = tmp + 2; // skip ") " num = sscanf(S, - "%c " - "%d %d %d %d %d " - "%lu %ld %ld %ld %ld " - "%llu %llu %llu %llu " /* utime stime cutime cstime */ - "%ld %ld " - "%d " - "%ld " - "%llu " /* start_time */ - "%lu " - "%ld " - "%lu %lu %lu %lu %lu %lu " - "%*s %*s %*s %*s " /* discard, no RT signals & Linux 2.1 used hex */ - "%lu %*u %*u " - "%d %d " - "%lu %lu", + "%c " // state + "%d %d %d %d %d " // ppid, pgrp, sid, tty_nr, tty_pgrp + "%lu %lu %lu %lu %lu " // flags, min_flt, cmin_flt, maj_flt, cmaj_flt + "%llu %llu %llu %llu " // utime, stime, cutime, cstime + "%d %d " // priority, nice + "%d " // num_threads + "%lu " // 'alarm' == it_real_value (obsolete, always 0) + "%llu " // start_time + "%lu " // vsize + "%lu " // rss + "%lu %lu %lu %lu %lu %lu " // rsslim, start_code, end_code, start_stack, esp, eip + "%*s %*s %*s %*s " // pending, blocked, sigign, sigcatch <=== DISCARDED + "%lu %*u %*u " // 0 (former wchan), 0, 0 <=== Placeholders only + "%d %d " // exit_signal, task_cpu + "%d %d " // rt_priority, policy (sched) + "%llu %llu %llu", // blkio_ticks, gtime, cgtime &P->state, &P->ppid, &P->pgrp, &P->session, &P->tty, &P->tpgid, &P->flags, &P->min_flt, &P->cmin_flt, &P->maj_flt, &P->cmaj_flt, @@ -582,7 +583,8 @@ ENTER(0x160); /* -- Linux 2.0.35 ends here -- */ &P->exit_signal, &P->processor, /* 2.2.1 ends with "exit_signal" */ /* -- Linux 2.2.8 to 2.5.17 end here -- */ - &P->rtprio, &P->sched /* both added to 2.5.18 */ + &P->rtprio, &P->sched, /* both added to 2.5.18 */ + &P->blkio_tics, &P->gtime, &P->cgtime ); if(!P->nlwp){ @@ -596,7 +598,7 @@ LEAVE(0x160); static void statm2proc(const char* s, proc_t *restrict P) { int num; - num = sscanf(s, "%ld %ld %ld %ld %ld %ld %ld", + num = sscanf(s, "%lu %lu %lu %lu %lu %lu %lu", &P->size, &P->resident, &P->share, &P->trs, &P->lrs, &P->drs, &P->dt); /* fprintf(stderr, "statm2proc converted %d fields.\n",num); */ diff --git a/proc/readproc.h b/proc/readproc.h index 7b9f3d2e..ee918310 100644 --- a/proc/readproc.h +++ b/proc/readproc.h @@ -21,13 +21,6 @@ __BEGIN_DECLS -// ld cutime, cstime, priority, nice, timeout, alarm, rss, -// c state, -// d ppid, pgrp, session, tty, tpgid, -// s signal, blocked, sigignore, sigcatch, -// lu flags, min_flt, cmin_flt, maj_flt, cmaj_flt, utime, stime, -// lu rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip, -// lu start_time, vsize, wchan, // 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 @@ -44,11 +37,6 @@ typedef struct proc_t { int tid, // (special) task id, the POSIX thread ID (see also: tgid) ppid; // stat,status pid of parent process - long // next 2 fields are NOT filled in by readproc - maj_delta, // stat (special) major page faults since last update - min_delta; // stat (special) minor page faults since last update - unsigned - pcpu; // stat (special) %CPU usage (is not filled in by readproc!!!) char state, // stat,status single-char code for process state (S=sleeping) #ifdef FALSE_THREADS @@ -65,7 +53,14 @@ typedef struct proc_t { // and so on... 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 1-1-70 + start_time, // stat start time of process -- seconds since 1-1-70 + 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 #ifdef SIGNAL_STRING char // Linux 2.1.7x and up have 64 signals. Allow 64, plus '\0' and padding. @@ -89,12 +84,13 @@ typedef struct proc_t { 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 - long - priority, // stat kernel scheduling priority - nice, // stat standard unix nice level of process + wchan, // stat (special) address of kernel wait channel proc is sleeping in rss, // stat identical to 'resident' - alarm, // stat ? + 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) @@ -103,7 +99,7 @@ typedef struct proc_t { 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) - long + 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) @@ -115,8 +111,6 @@ typedef struct proc_t { 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) - rtprio, // stat real-time priority - sched, // stat scheduling class vsize, // stat number of pages of virtual memory ... rss_rlim, // stat resident set size limit? flags, // stat kernel flags for the process @@ -145,6 +139,8 @@ typedef struct proc_t { *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