top: whack insidious bug surrounding auto-sized fields

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>
This commit is contained in:
Jim Warner 2019-10-12 00:00:00 -05:00 committed by Craig Small
parent 11cf6cc005
commit 8174a5c8b7
2 changed files with 7 additions and 6 deletions

View File

@ -2173,7 +2173,8 @@ static inline void widths_resize (void) {
Autox_found = 1; 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 } // end: widths_resize
@ -5935,6 +5936,10 @@ static void frame_make (void) {
WIN_t *w = Curwin; // avoid gcc bloat with a local copy WIN_t *w = Curwin; // avoid gcc bloat with a local copy
int i, scrlins; 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... // deal with potential signal(s) since the last time around...
if (Frames_signal) if (Frames_signal)
zap_fieldstab(); zap_fieldstab();
@ -5986,10 +5991,6 @@ static void frame_make (void) {
/* we'll deem any terminal not supporting tgoto as dumb and disable /* we'll deem any terminal not supporting tgoto as dumb and disable
the normal non-interactive output optimization... */ the normal non-interactive output optimization... */
if (!Cap_can_goto) PSU_CLREOS(0); 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 } // end: frame_make

View File

@ -202,7 +202,7 @@ enum scale_enum {
/* Used to manipulate (and document) the Frames_signal states */ /* Used to manipulate (and document) the Frames_signal states */
enum resize_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 */ /* This typedef just ensures consistent 'process flags' handling */