top: harden management of 'Hide_pid' array allocations

While setting the size of that Hide_pid array to equal
total pids high water mark was probably safe, in truth
there is no real relationship. At some point one could
exceed that HWM if the 'v' toggle was used extensively
and at least 1 of those entries remained non-negative.

This commit simply divorces Hide_tot from the pids HWM
and bases Hide_pid array size on actual run-time need.

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2018-10-08 00:00:00 -05:00 committed by Craig Small
parent d8a0ab8bc1
commit dbe12b5400

View File

@ -4712,7 +4712,7 @@ static int Tree_idx; // frame_make resets to zero
array holds parent pids whose children have been manipulated. array holds parent pids whose children have been manipulated.
positive pid values represent parents with collapsed children positive pid values represent parents with collapsed children
while a negative pid value means children have been expanded. while a negative pid value means children have been expanded.
( both of these are managed under the 'keys_task()' routine ) */ ( the first two are managed under the 'keys_task()' routine ) */
static int *Hide_pid; // collapsible process array static int *Hide_pid; // collapsible process array
static int Hide_tot; // total used in above array static int Hide_tot; // total used in above array
#ifndef TREE_VCPUOFF #ifndef TREE_VCPUOFF
@ -4771,7 +4771,6 @@ static void forest_create (WIN_t *q) {
if (hwmsav < Frame_maxtask) { // grow, but never shrink if (hwmsav < Frame_maxtask) { // grow, but never shrink
hwmsav = Frame_maxtask; hwmsav = Frame_maxtask;
Tree_ppt = alloc_r(Tree_ppt, sizeof(proc_t *) * hwmsav); Tree_ppt = alloc_r(Tree_ppt, sizeof(proc_t *) * hwmsav);
Hide_pid = alloc_r(Hide_pid, sizeof(int) * hwmsav);
#ifndef TREE_VCPUOFF #ifndef TREE_VCPUOFF
Hide_cpu = alloc_r(Hide_cpu, sizeof(unsigned) * hwmsav); Hide_cpu = alloc_r(Hide_cpu, sizeof(unsigned) * hwmsav);
#endif #endif
@ -5405,13 +5404,21 @@ static void keys_task (int ch) {
break; break;
} }
} }
if (i == Hide_tot) Hide_pid[Hide_tot++] = pid; if (i == Hide_tot) {
// plenty of room, but if everything's expanded let's reset ... static int totsav;
if (Hide_tot >= totsav) {
totsav += 128;
Hide_pid = alloc_r(Hide_pid, sizeof(int) * totsav);
}
Hide_pid[Hide_tot++] = pid;
} else {
// if everything's expanded, let's empty the array ...
for (i = 0; i < Hide_tot; i++) for (i = 0; i < Hide_tot; i++)
if (Hide_pid[i] > 0) break; if (Hide_pid[i] > 0) break;
if (i == Hide_tot) Hide_tot = 0; if (i == Hide_tot) Hide_tot = 0;
} }
} }
}
break; break;
case 'x': case 'x':
if (VIZCHKw(w)) { if (VIZCHKw(w)) {