From acda6f40d179087ed19d657e33d7c593e8a28b10 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Sun, 21 Aug 2016 00:00:00 -0500 Subject: [PATCH] library: miscellaneous additional efficiencies, This patch contains the following miscellaneous stuff: . The pids_stacks_fetch() routine might call for newly allocated stacks to be itemized. However, that job was already tended to by the pids_stacks_alloc() function. So, this patch just eliminates a redundant invocation. ------------------------------------------------------ . The concept of 'dirty_stacks' has not kept pace with the evolving stacks implementation. Originally, stacks were considered dirty only if free() of dynamic memory was needed before refreshing any single result struct. Later, with the introduction of the 'extra' item and a promise to reset it to zero, 'dirty' was much broader. So, this patch just treats the dirty flg as others do. ------------------------------------------------------ . Lastly, a word or three about performance & timings. Tuning efforts concentrated on the API and top. And unless an oldlib equivalent to the preceding patch is applied (favoring stat vs. status), newlib top will often outperform the oldlib version (obviously wrong). So assuming /proc/stat is preferred in both libraries, generally speaking, a cpu and elapsed time increase of 1-5% was found for this new stacks oriented interface. Of course, there's also an increased memory footprint. There are some occasions, however, when the newlib top is at a substantial disadvantage. For example if WCHAN or TTY is displayed, such items will be present in all newlib reaped stacks (i.e. every process). But old top would only incur such overhead with displayable tasks. Thus, oldlib top could outperform newlib by up to 25%, for example, if only fields requiring NO library flags were displayed. However, such a scenario is not likely since only GID, UID, PID, TGID & WCHAN would be shown. In the usual case, that overhead associated with WCHAN and/or TTY is overshadowed by other top runtime costs. All in all a pleasing outcome I deem quite acceptable. ------------------------------------------------------ Signed-off-by: Jim Warner --- proc/pids.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/proc/pids.c b/proc/pids.c index c42dbc46..a20f3a2e 100644 --- a/proc/pids.c +++ b/proc/pids.c @@ -76,7 +76,7 @@ struct pids_info { struct fetch_support fetch; // support for procps_pids_reap & select int history_yes; // need historical data struct history_info *hist; // pointer to historical support data - int dirty_stacks; // extents need dynamic storage clean + int dirty_stacks; // stacks results need attention proc_t*(*read_something)(PROCTAB*, proc_t*); // readproc/readeither via which unsigned pgs2k_shift; // to convert some proc vaules unsigned oldflags; // the old library PROC_FILL flagss @@ -773,7 +773,6 @@ static inline void pids_assign_results ( if (item >= PIDS_logical_end) break; Item_table[item].setsfunc(info, this, p); - info->dirty_stacks |= Item_table[item].freefunc ? 1 : 0; ++this; } return; @@ -1062,7 +1061,6 @@ static int pids_stacks_fetch ( return -ENOMEM; memset(info->fetch.anchor, 0, sizeof(void *) * n_alloc); memcpy(info->fetch.anchor, ext->stacks, sizeof(void *) * n_alloc); - pids_itemize_stacks_all(info); } pids_cleanup_stacks_all(info); pids_toggle_history(info); @@ -1095,6 +1093,7 @@ static int pids_stacks_fetch ( } memcpy(info->fetch.results.stacks, info->fetch.anchor, sizeof(void *) * n_inuse); info->fetch.results.stacks[n_inuse] = NULL; + info->dirty_stacks = 1; return n_inuse; // callers beware, this might be zero ! #undef n_alloc