top can show loose tasks now
This commit is contained in:
parent
864a5356a1
commit
38d36b4960
1
NEWS
1
NEWS
@ -1,5 +1,6 @@
|
|||||||
procps-3.2.5 --> procps-3.2.6
|
procps-3.2.5 --> procps-3.2.6
|
||||||
|
|
||||||
|
top can do per-task display -- thanks John Blackwood rh114012
|
||||||
more MIPS crud -- thanks Jim Gifford and Ryan Oliver
|
more MIPS crud -- thanks Jim Gifford and Ryan Oliver
|
||||||
begin prep for setuid
|
begin prep for setuid
|
||||||
|
|
||||||
|
99
top.c
99
top.c
@ -1081,6 +1081,7 @@ static proc_t **procs_refresh (proc_t **table, int flags)
|
|||||||
proc_t *ptsk = (proc_t *)-1; // first time, Force: (ii)
|
proc_t *ptsk = (proc_t *)-1; // first time, Force: (ii)
|
||||||
unsigned curmax = 0; // every time (jeeze)
|
unsigned curmax = 0; // every time (jeeze)
|
||||||
PROCTAB* PT;
|
PROCTAB* PT;
|
||||||
|
static int show_threads_was_enabled = 0; // optimization
|
||||||
|
|
||||||
prochlp(NULL); // prep for a new frame
|
prochlp(NULL); // prep for a new frame
|
||||||
if (Monpidsidx)
|
if (Monpidsidx)
|
||||||
@ -1089,24 +1090,75 @@ static proc_t **procs_refresh (proc_t **table, int flags)
|
|||||||
PT = openproc(flags);
|
PT = openproc(flags);
|
||||||
|
|
||||||
// i) Allocated Chunks: *Existing* table; refresh + reuse
|
// i) Allocated Chunks: *Existing* table; refresh + reuse
|
||||||
while (curmax < savmax) {
|
if (!(CHKw(Curwin, Show_THREADS))) {
|
||||||
if (table[curmax]->cmdline) {
|
while (curmax < savmax) {
|
||||||
free(*table[curmax]->cmdline);
|
if (table[curmax]->cmdline) {
|
||||||
table[curmax]->cmdline = NULL;
|
unsigned idx;
|
||||||
|
// Skip if Show_THREADS was never enabled
|
||||||
|
if (show_threads_was_enabled) {
|
||||||
|
for (idx = curmax + 1; idx < savmax; idx++) {
|
||||||
|
if (table[idx]->cmdline == table[curmax]->cmdline)
|
||||||
|
table[idx]->cmdline = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(*table[curmax]->cmdline);
|
||||||
|
table[curmax]->cmdline = NULL;
|
||||||
|
}
|
||||||
|
if (unlikely(!(ptsk = readproc(PT, table[curmax])))) break;
|
||||||
|
prochlp(ptsk); // tally & complete this proc_t
|
||||||
|
++curmax;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // show each thread in a process separately
|
||||||
|
while (curmax < savmax) {
|
||||||
|
proc_t *ttsk;
|
||||||
|
if (unlikely(!(ptsk = readproc(PT, NULL)))) break;
|
||||||
|
show_threads_was_enabled = 1;
|
||||||
|
while (curmax < savmax) {
|
||||||
|
unsigned idx;
|
||||||
|
if (table[curmax]->cmdline) {
|
||||||
|
// threads share the same cmdline storage. 'table' is
|
||||||
|
// qsort()ed, so must look through the rest of the table.
|
||||||
|
for (idx = curmax + 1; idx < savmax; idx++) {
|
||||||
|
if (table[idx]->cmdline == table[curmax]->cmdline)
|
||||||
|
table[idx]->cmdline = NULL;
|
||||||
|
}
|
||||||
|
free(*table[curmax]->cmdline); // only free once
|
||||||
|
table[curmax]->cmdline = NULL;
|
||||||
|
}
|
||||||
|
if (!(ttsk = readtask(PT, ptsk, table[curmax]))) break;
|
||||||
|
prochlp(ttsk);
|
||||||
|
++curmax;
|
||||||
|
}
|
||||||
|
free(ptsk); // readproc() proc_t not used
|
||||||
}
|
}
|
||||||
if (unlikely(!(ptsk = readproc(PT, table[curmax])))) break;
|
|
||||||
prochlp(ptsk); // tally & complete this proc_t
|
|
||||||
++curmax;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ii) Unallocated Chunks: *New* or *Existing* table; extend + fill
|
// ii) Unallocated Chunks: *New* or *Existing* table; extend + fill
|
||||||
while (ptsk) {
|
if (!(CHKw(Curwin, Show_THREADS))) {
|
||||||
// realloc as we go, keeping 'table' ahead of 'currmax++'
|
while (ptsk) {
|
||||||
table = alloc_r(table, (curmax + 1) * PTRsz);
|
// realloc as we go, keeping 'table' ahead of 'currmax++'
|
||||||
// here, readproc will allocate the underlying proc_t stg
|
table = alloc_r(table, (curmax + 1) * PTRsz);
|
||||||
if (likely(ptsk = readproc(PT, NULL))) {
|
// here, readproc will allocate the underlying proc_t stg
|
||||||
prochlp(ptsk); // tally & complete this proc_t
|
if (likely(ptsk = readproc(PT, NULL))) {
|
||||||
table[curmax++] = ptsk;
|
prochlp(ptsk); // tally & complete this proc_t
|
||||||
|
table[curmax++] = ptsk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // show each thread in a process separately
|
||||||
|
while (ptsk) {
|
||||||
|
proc_t *ttsk;
|
||||||
|
if (likely(ptsk = readproc(PT, NULL))) {
|
||||||
|
show_threads_was_enabled = 1;
|
||||||
|
while (1) {
|
||||||
|
table = alloc_r(table, (curmax + 1) * PTRsz);
|
||||||
|
if (!(ttsk = readtask(PT, ptsk, NULL))) break;
|
||||||
|
prochlp(ttsk);
|
||||||
|
table[curmax++] = ttsk;
|
||||||
|
}
|
||||||
|
free(ptsk); // readproc() proc_t not used
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closeproc(PT);
|
closeproc(PT);
|
||||||
@ -1427,8 +1479,8 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
|
|||||||
case 'i':
|
case 'i':
|
||||||
rc->win[0].winflags &= ~Show_IDLEPS;
|
rc->win[0].winflags &= ~Show_IDLEPS;
|
||||||
break;
|
break;
|
||||||
case 'H': // 'H' = show threads (yea, sure)
|
case 'H':
|
||||||
//rc->win[0].winflags |= ;
|
rc->win[0].winflags |= Show_THREADS;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
rc->win[0].winflags &= ~View_MEMORY;
|
rc->win[0].winflags &= ~View_MEMORY;
|
||||||
@ -1742,7 +1794,7 @@ static void parse_args (char **args)
|
|||||||
. bunched args are actually handled properly and none are ignored
|
. bunched args are actually handled properly and none are ignored
|
||||||
. we tolerate NO whitespace and NO switches -- maybe too tolerant? */
|
. we tolerate NO whitespace and NO switches -- maybe too tolerant? */
|
||||||
static const char usage[] =
|
static const char usage[] =
|
||||||
" -hv | -bcisS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]";
|
" -hv | -bcisSH -d delay -n iterations [-u user | -U user] -p pid [,pid ...]";
|
||||||
float tmp_delay = MAXFLOAT;
|
float tmp_delay = MAXFLOAT;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@ -1768,7 +1820,10 @@ static void parse_args (char **args)
|
|||||||
if (sscanf(cp, "%f", &tmp_delay) != 1)
|
if (sscanf(cp, "%f", &tmp_delay) != 1)
|
||||||
std_err(fmtmk("bad delay '%s'", cp));
|
std_err(fmtmk("bad delay '%s'", cp));
|
||||||
break;
|
break;
|
||||||
case 'h': case 'H':
|
case 'H':
|
||||||
|
TOGw(Curwin, Show_THREADS);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
case 'v': case 'V':
|
case 'v': case 'V':
|
||||||
std_out(fmtmk("%s\nusage:\t%s%s", procps_version, Myname, usage));
|
std_out(fmtmk("%s\nusage:\t%s%s", procps_version, Myname, usage));
|
||||||
case 'i':
|
case 'i':
|
||||||
@ -2482,6 +2537,14 @@ static void do_key (unsigned c)
|
|||||||
win_select(0);
|
win_select(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
if (VIZCHKc) {
|
||||||
|
TOGw(Curwin, Show_THREADS);
|
||||||
|
show_msg(fmtmk("Show threads %s"
|
||||||
|
, CHKw(Curwin, Show_THREADS) ? "On" : "Off"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
case '?':
|
case '?':
|
||||||
{ char ch;
|
{ char ch;
|
||||||
|
3
top.h
3
top.h
@ -277,6 +277,7 @@ enum pflag {
|
|||||||
#define View_NOBOLD 0x0001 // 'B' - disable 'bold' attribute globally
|
#define View_NOBOLD 0x0001 // 'B' - disable 'bold' attribute globally
|
||||||
|
|
||||||
// 'Show_' & 'Qsrt_' flags are for task display in a visible window
|
// 'Show_' & 'Qsrt_' flags are for task display in a visible window
|
||||||
|
#define Show_THREADS 0x10000 // 'H' - show threads in each task
|
||||||
#define Show_COLORS 0x0800 // 'z' - show in color (vs. mono)
|
#define Show_COLORS 0x0800 // 'z' - show in color (vs. mono)
|
||||||
#define Show_HIBOLD 0x0400 // 'b' - rows and/or cols bold (vs. reverse)
|
#define Show_HIBOLD 0x0400 // 'b' - rows and/or cols bold (vs. reverse)
|
||||||
#define Show_HICOLS 0x0200 // 'x' - show sort column highlighted
|
#define Show_HICOLS 0x0200 // 'x' - show sort column highlighted
|
||||||
@ -413,7 +414,7 @@ typedef struct WIN_t {
|
|||||||
" f,o . Fields/Columns: '\01f\02' add or remove; '\01o\02' change display order\n" \
|
" f,o . Fields/Columns: '\01f\02' add or remove; '\01o\02' change display order\n" \
|
||||||
" F or O . Select sort field\n" \
|
" F or O . Select sort field\n" \
|
||||||
" <,> . Move sort field: '\01<\02' next col left; '\01>\02' next col right\n" \
|
" <,> . Move sort field: '\01<\02' next col left; '\01>\02' next col right\n" \
|
||||||
" R . Toggle normal/reverse sort\n" \
|
" R,H . Toggle: '\01R\02' normal/reverse sort; '\01H\02' show threads\n" \
|
||||||
" c,i,S . Toggle: '\01c\02' cmd name/line; '\01i\02' idle tasks; '\01S\02' cumulative time\n" \
|
" c,i,S . Toggle: '\01c\02' cmd name/line; '\01i\02' idle tasks; '\01S\02' cumulative time\n" \
|
||||||
" x\05,\01y\05 . Toggle highlights: '\01x\02' sort field; '\01y\02' running tasks\n" \
|
" x\05,\01y\05 . Toggle highlights: '\01x\02' sort field; '\01y\02' running tasks\n" \
|
||||||
" z\05,\01b\05 . Toggle: '\01z\02' color/mono; '\01b\02' bold/reverse (only if 'x' or 'y')\n" \
|
" z\05,\01b\05 . Toggle: '\01z\02' color/mono; '\01b\02' bold/reverse (only if 'x' or 'y')\n" \
|
||||||
|
Loading…
Reference in New Issue
Block a user