diff -up procps-3.2.8/top.c.threads procps-3.2.8/top.c --- procps-3.2.8/top.c.threads 2009-10-01 07:14:43.000000000 -0400 +++ procps-3.2.8/top.c 2009-10-05 14:05:00.000000000 -0400 @@ -1138,6 +1138,7 @@ static proc_t **procs_refresh (proc_t ** #define ENTsz sizeof(proc_t) static unsigned savmax = 0; // first time, Bypass: (i) proc_t *ptsk = (proc_t *)-1; // first time, Force: (ii) + proc_t *saved_ptsk; unsigned curmax = 0; // every time (jeeze) PROCTAB* PT; static int show_threads_was_enabled = 0; // optimization @@ -1172,6 +1173,10 @@ static proc_t **procs_refresh (proc_t ** while (curmax < savmax) { proc_t *ttsk; if (unlikely(!(ptsk = readproc(PT, NULL)))) break; + if(!show_threads_was_enabled) + saved_ptsk = ptsk; + else + saved_ptsk = NULL; show_threads_was_enabled = 1; while (curmax < savmax) { unsigned idx; @@ -1189,7 +1194,7 @@ static proc_t **procs_refresh (proc_t ** prochlp(ttsk); ++curmax; } - free(ptsk); // readproc() proc_t not used + if(!saved_ptsk) free(ptsk); // readproc() proc_t not used } } @@ -1208,7 +1213,8 @@ static proc_t **procs_refresh (proc_t ** else { // show each thread in a process separately while (ptsk) { proc_t *ttsk; - if (likely(ptsk = readproc(PT, NULL))) { + if (likely(ptsk = readproc(PT, NULL)) || + unlikely(saved_ptsk && (ptsk = saved_ptsk)) ) { show_threads_was_enabled = 1; while (1) { table = alloc_r(table, (curmax + 1) * PTRsz); @@ -1216,6 +1222,7 @@ static proc_t **procs_refresh (proc_t ** prochlp(ttsk); table[curmax++] = ttsk; } + saved_ptsk = NULL; free(ptsk); // readproc() proc_t not used } }