]> granicus.if.org Git - procps-ng/commitdiff
library: miscellaneous additional efficiencies, <pids>
authorJim Warner <james.warner@comcast.net>
Sun, 21 Aug 2016 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Tue, 23 Aug 2016 11:11:09 +0000 (21:11 +1000)
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 <pids> 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 <james.warner@comcast.net>
proc/pids.c

index c42dbc46837bf83d343925733d409cdc80bd43d6..a20f3a2e797719ed80715d177821a48f305211cb 100644 (file)
@@ -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