]> granicus.if.org Git - procps-ng/commitdiff
top: refactor 'mkVIZ' support to avoid future problems
authorJim Warner <james.warner@comcast.net>
Tue, 15 Jun 2021 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Thu, 17 Jun 2021 06:42:58 +0000 (16:42 +1000)
In the patch referenced below, 2 potential abends were
fixed both of which involved 'alternate display mode'.

The root cause of those abends was a negative value in
the 'begnext' field for other than the current window.

And while that potential is fixed for now the existing
code almost invites such problems again in the future.

So, this patch will remove any temptation to name some
other window in the 'mkVIZrow1' macro. And, since that
macro is not the only source of 'begnext' changes, the
'mkVizrowX' is being added to identify such occasions.

[ and for symmetry i've added a 'mkVIZyes' macro and ]
[ ameliorated an otherwise surreptitious assignment! ]

Reference(s):
commit 8281ac4f98cf04c51cbeb746d214201531d660ec

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c
top/top.h

index 5905d6fe4662b159f6645b52cf13ac674e80b262..f2b4e1aa5d2edfe5a276d9cf43351eb9a337c2ec 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -4293,7 +4293,7 @@ static void wins_stage_2 (void) {
 
    // with preserved 'other filters' & command line 'user filters',
    // we must ensure that we always have a visible task on row one.
-   mkVIZrow1(Curwin);
+   mkVIZrow1
 
    // lastly, initialize a signal set used to throttle one troublesome signal
    sigemptyset(&Sigwinch_set);
@@ -4735,7 +4735,7 @@ static void keys_global (int ch) {
       case '?':
       case 'h':
          help_view();
-         mkVIZrow1(Curwin);
+         mkVIZrow1
          break;
       case 'B':
          TOGw(w, View_NOBOLD);
@@ -4763,7 +4763,7 @@ static void keys_global (int ch) {
          break;
       case 'g':
          win_select(0);
-         mkVIZrow1(Curwin);
+         mkVIZrow1
          break;
       case 'H':
          Thread_mode = !Thread_mode;
@@ -4843,7 +4843,7 @@ static void keys_global (int ch) {
          break;
       case 'Z':
          wins_colors();
-         mkVIZrow1(Curwin);
+         mkVIZrow1
          break;
       case '0':
          Rc.zero_suppress = !Rc.zero_suppress;
@@ -5047,7 +5047,7 @@ static void keys_task (int ch) {
       case kbd_CtrlO:
          if (VIZCHKw(w)) {
             other_filters(ch);
-            mkVIZrow1(w);
+            mkVIZrow1
          }
          break;
       case 'U':
@@ -5057,7 +5057,7 @@ static void keys_task (int ch) {
             if (*str != kbd_ESC
             && (errmsg = user_certify(w, str, ch)))
                 show_msg(errmsg);
-            mkVIZrow1(w);
+            mkVIZrow1
          }
          break;
       case 'V':
@@ -5165,7 +5165,7 @@ static void keys_window (int ch) {
       case 'w':
          if (ALTCHKw) {
             win_select(ch);
-            mkVIZrow1(Curwin);
+            mkVIZrow1
          }
          break;
       case 'G':
@@ -5176,10 +5176,10 @@ static void keys_window (int ch) {
          }
          break;
       case kbd_UP:
-         if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begnext = -1;
+         if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) mkVIZrowX(-1)
          break;
       case kbd_DOWN:
-         if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begnext = +1;
+         if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) mkVIZrowX(+1)
          break;
 #ifdef USE_X_COLHDR // ------------------------------------
       case kbd_LEFT:
@@ -5249,30 +5249,30 @@ static void keys_window (int ch) {
       case kbd_PGUP:
          if (VIZCHKw(w)) {
             if (CHKw(w, Show_IDLEPS) && 0 < w->begtask) {
-               w->begnext = -(w->winlines - (Rc.mode_altscr ? 1 : 2));
+               mkVIZrowX(-(w->winlines - (Rc.mode_altscr ? 1 : 2)))
             }
          }
          break;
       case kbd_PGDN:
          if (VIZCHKw(w)) {
             if (CHKw(w, Show_IDLEPS) && w->begtask < PIDSmaxt - 1) {
-               w->begnext = +(w->winlines - (Rc.mode_altscr ? 1 : 2));
+               mkVIZrowX(+(w->winlines - (Rc.mode_altscr ? 1 : 2)))
             }
          }
          break;
       case kbd_HOME:
 #ifndef SCROLLVAR_NO
          if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = w->varcolbeg = 0;
-         mkVIZrow1(w);
+         mkVIZrow1
 #else
          if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = 0;
-         mkVIZrow1(w);
+         mkVIZrow1
 #endif
          break;
       case kbd_END:
          if (VIZCHKw(w)) {
             if (CHKw(w, Show_IDLEPS)) {
-               w->begnext = (PIDSmaxt - w->winlines) + 1;
+               mkVIZrowX((PIDSmaxt - w->winlines) + 1)
                w->begpflg = w->endpflg;
 #ifndef SCROLLVAR_NO
                w->varcolbeg = 0;
@@ -6006,7 +6006,8 @@ static const char *task_show (const WIN_t *q, struct pids_stack *p) {
          *   1) exclusively for the 'current' window
          *   2) immediately after interacting with the user
          *   3) who struck: up, down, pgup, pgdn, home, end, 'o/O' or 'u/U'
-         *   4) or upon the user switching from one window to another window */
+         *   4) or upon the user switching from one window to another window
+         * ( note: it's entirely possible there are NO visible tasks to show ) */
 static void window_hlp (void) {
    WIN_t *w = Curwin;             // avoid gcc bloat with a local copy
    int i, reversed;
@@ -6040,8 +6041,10 @@ fwd_redux:
       && (*task_show(w, w->ppt[i])))
          break;
    }
+   w->begtask = i;
+
    // reached the top, but maybe this guy ain't visible
-   if (!(w->begtask = i) && !reversed) {
+   if (!w->begtask && !reversed) {
       if (!(wins_usrselect(w, w->ppt[0]))
       || (!(*task_show(w, w->ppt[0])))) {
          reversed = 1;
@@ -6081,7 +6084,7 @@ static int window_show (WIN_t *q, int wmax) {
          error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__, strerror(errno)));
    }
 
-   if (q->begnext) window_hlp();
+   if (mkVIZyes) window_hlp();
    else OFFw(q, NOPRINT_xxx);
 
    i = q->begtask;
index 770115341e3c0fee9a3c4969b58e0f75a07eeb35..d006e61e0fc7b7c12380060c455ec8f420bc38a2 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -402,7 +402,9 @@ typedef struct WIN_t {
 
         // Support for a proper (visible) row #1 whenever Curwin changes
         // ( or a key which might affect vertical scrolling was struck )
-#define mkVIZrow1(q) { q->begtask -= 1; q->begnext = +1; }
+#define mkVIZyes       Curwin->begnext != 0
+#define mkVIZrow1    { Curwin->begnext = +1; Curwin->begtask -= 1; }
+#define mkVIZrowX(n) { Curwin->begnext = (n); }
 
         /* Special Section: end ------------------------------------------ */
         /* /////////////////////////////////////////////////////////////// */