diff --git a/top/top.c b/top/top.c index aa2777b2..a48a5b91 100644 --- a/top/top.c +++ b/top/top.c @@ -220,6 +220,7 @@ static int Numa_node_tot; static int Numa_node_sel = -1; #ifndef NUMA_DISABLE static void *Libnuma_handle; +static int stderr_save = -1; #if defined(PRETEND_NUMA) || defined(PRETEND8CPUS) static int Numa_max_node(void) { return 3; } static int Numa_node_of_cpu(int num) { return (num % 4); } @@ -4043,6 +4044,17 @@ static void wins_stage_2 (void) { // fill in missing Fieldstab members and build each window's columnhdr zap_fieldstab(); +#ifndef NUMA_DISABLE + /* there's a chance that damn libnuma may spew to stderr so we gotta + make sure he does not corrupt poor ol' top's first output screen! + Yes, he provides some overridable 'weak' functions to change such + behavior but we can't exploit that since we don't follow a normal + ld route to symbol resolution (we use that dlopen() guy instead)! */ + stderr_save = dup(fileno(stderr)); + if (-1 < stderr_save && freopen("/dev/null", "w", stderr)) + ; // avoid -Wunused-result +#endif + // lastly, initialize a signal set used to throttle one troublesome signal sigemptyset(&Sigwinch_set); #ifdef SIGNALS_LESS @@ -5508,6 +5520,16 @@ static void frame_make (void) { the normal non-interactive output optimization... */ if (!Cap_can_goto) PSU_CLREOS(0); +#ifndef NUMA_DISABLE + /* we gotta reverse the stderr redirect which was employed in wins_stage_2 + and needed because the two libnuma 'weak' functions were useless to us! */ + if (-1 < stderr_save) { + dup2(stderr_save, fileno(stderr)); + close(stderr_save); + stderr_save = -1; + } +#endif + /* lastly, check auto-sized width needs for the next iteration */ if (AUTOX_MODE && Autox_found) widths_resize();