]> granicus.if.org Git - procps-ng/commitdiff
top: whack insidious bug surrounding auto-sized fields
authorJim Warner <james.warner@comcast.net>
Sat, 12 Oct 2019 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Sun, 27 Oct 2019 11:27:49 +0000 (22:27 +1100)
This patch will eliminate a bug which is unique to our
newlib branch. It's extremely rare and only happens if
a search ('L'/'&') is initiated during the period when
fields are currently being auto-sized (AUTOX_MODE on).

This bug surfaces as either all zero results for tasks
displayed or a segmentation fault, depending upon what
fields were activated. It is caused by the timing of a
call to the <pids> 'reset' function. When called after
a task refresh, but before do_key(), this bug appears.

So this patch just ensures that 'reset' will be called
after do_key() & before the tasks have been refreshed.

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

index 045748e95bfa4233c6a42b657217d71b98042038..a66eef0fb9a9d3ac877c90da046aa97675f90da0 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -2173,7 +2173,8 @@ static inline void widths_resize (void) {
          Autox_found = 1;
       }
    }
-   if (Autox_found) calibrate_fields();
+   // trigger a call to calibrate_fields (via zap_fieldstab)
+   if (Autox_found) Frames_signal = BREAK_autox;
 } // end: widths_resize
 
 
@@ -5935,6 +5936,10 @@ static void frame_make (void) {
    WIN_t *w = Curwin;             // avoid gcc bloat with a local copy
    int i, scrlins;
 
+   // check auto-sized width increases from the last iteration...
+   if (AUTOX_MODE && Autox_found)
+      widths_resize();
+
    // deal with potential signal(s) since the last time around...
    if (Frames_signal)
       zap_fieldstab();
@@ -5986,10 +5991,6 @@ static void frame_make (void) {
    /* we'll deem any terminal not supporting tgoto as dumb and disable
       the normal non-interactive output optimization... */
    if (!Cap_can_goto) PSU_CLREOS(0);
-
-   /* lastly, check auto-sized width needs for the next iteration */
-   if (AUTOX_MODE && Autox_found)
-      widths_resize();
 } // end: frame_make
 
 
index 9ee42848c90a8c24366c1a79d937e6fd6040d01a..12fdef214a2fd15ee57c13d8abaddcbe14ae89bb 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -202,7 +202,7 @@ enum scale_enum {
 
         /* Used to manipulate (and document) the Frames_signal states */
 enum resize_states {
-   BREAK_off = 0, BREAK_kbd, BREAK_sig
+   BREAK_off = 0, BREAK_kbd, BREAK_sig, BREAK_autox
 };
 
         /* This typedef just ensures consistent 'process flags' handling */