top: make for consistent & enhanced cpu % calculations

That issue cited below prompted some changes under the
newlib branch to standardize the calculation involving
busy, idle, user & system accumulated plus delta tics.

This patch will bring our master branch version of top
into agreement with that newlib version which exploits
some of those newly added library extended provisions.

Reference(s):
https://gitlab.com/procps-ng/procps/issues/48

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2016-12-26 07:07:07 -06:00 committed by Craig Small
parent c41c614b0c
commit 398b83f40f

View File

@ -5080,6 +5080,7 @@ static void summary_hlp (CPU_t *cpu, const char *pfx) {
which has happened with some SMP kernels (pre-2.4?) which has happened with some SMP kernels (pre-2.4?)
and when cpus are dynamically added or removed */ and when cpus are dynamically added or removed */
#define TRIMz(x) ((tz = (SIC_t)(x)) < 0 ? 0 : tz) #define TRIMz(x) ((tz = (SIC_t)(x)) < 0 ? 0 : tz)
// user syst nice idle wait hirg sirq steal
SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz; SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz;
float scale; float scale;
@ -5092,13 +5093,11 @@ static void summary_hlp (CPU_t *cpu, const char *pfx) {
y_frme = TRIMz(cpu->cur.y - cpu->sav.y); y_frme = TRIMz(cpu->cur.y - cpu->sav.y);
z_frme = TRIMz(cpu->cur.z - cpu->sav.z); z_frme = TRIMz(cpu->cur.z - cpu->sav.z);
tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme; tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme;
#ifdef CPU_ZEROTICS #ifndef CPU_ZEROTICS
if (1 > tot_frme) tot_frme = 1;
#else
if (tot_frme < cpu->edge) if (tot_frme < cpu->edge)
tot_frme = u_frme = s_frme = n_frme = i_frme = w_frme = x_frme = y_frme = z_frme = 0; tot_frme = u_frme = s_frme = n_frme = i_frme = w_frme = x_frme = y_frme = z_frme = 0;
if (1 > tot_frme) i_frme = tot_frme = 1;
#endif #endif
if (1 > tot_frme) i_frme = tot_frme = 1;
scale = 100.0 / (float)tot_frme; scale = 100.0 / (float)tot_frme;
/* display some kinda' cpu state percentages /* display some kinda' cpu state percentages
@ -5113,11 +5112,11 @@ static void summary_hlp (CPU_t *cpu, const char *pfx) {
char user[SMLBUFSIZ], syst[SMLBUFSIZ], dual[MEDBUFSIZ]; char user[SMLBUFSIZ], syst[SMLBUFSIZ], dual[MEDBUFSIZ];
int ix = Curwin->rc.graph_cpus - 1; int ix = Curwin->rc.graph_cpus - 1;
float pct_user = (float)(u_frme + n_frme) * scale, float pct_user = (float)(u_frme + n_frme) * scale,
pct_syst = (float)s_frme * scale; pct_syst = (float)(s_frme + x_frme + y_frme) * scale;
#ifndef QUICK_GRAPHS #ifndef QUICK_GRAPHS
int num_user = (int)((pct_user * Graph_adj) + .5), int num_user = (int)((pct_user * Graph_adj) + .5),
num_syst = (int)((pct_syst * Graph_adj) + .5); num_syst = (int)((pct_syst * Graph_adj) + .5);
if (num_user + num_syst > Graph_len) --num_syst; if (num_user + num_syst > Graph_len) num_syst = Graph_len - num_user;
snprintf(user, sizeof(user), gtab[ix].user, num_user, gtab[ix].type); snprintf(user, sizeof(user), gtab[ix].user, num_user, gtab[ix].type);
snprintf(syst, sizeof(syst), gtab[ix].syst, num_syst, gtab[ix].type); snprintf(syst, sizeof(syst), gtab[ix].syst, num_syst, gtab[ix].type);
#else #else
@ -5279,7 +5278,7 @@ numa_nope:
#ifndef QUICK_GRAPHS #ifndef QUICK_GRAPHS
int num_used = (int)((pct_used * Graph_adj) + .5), int num_used = (int)((pct_used * Graph_adj) + .5),
num_misc = (int)((pct_misc * Graph_adj) + .5); num_misc = (int)((pct_misc * Graph_adj) + .5);
if (num_used + num_misc > Graph_len) --num_misc; if (num_used + num_misc > Graph_len) num_misc = Graph_len - num_used;
snprintf(used, sizeof(used), gtab[ix].used, num_used, gtab[ix].type); snprintf(used, sizeof(used), gtab[ix].used, num_used, gtab[ix].type);
snprintf(util, sizeof(util), gtab[ix].misc, num_misc, gtab[ix].type); snprintf(util, sizeof(util), gtab[ix].misc, num_misc, gtab[ix].type);
#else #else