From e583724fffe4fe2695d8366f110f8f6e7663f273 Mon Sep 17 00:00:00 2001 From: albert <> Date: Tue, 21 Oct 2003 00:51:36 +0000 Subject: [PATCH] H m -m -L -T are all working --- proc/readproc.c | 4 ++-- ps/display.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- top.c | 4 ++++ 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/proc/readproc.c b/proc/readproc.c index 2dd46da9..d7e195cb 100644 --- a/proc/readproc.c +++ b/proc/readproc.c @@ -666,7 +666,7 @@ static int simple_nexttid(PROCTAB *restrict const PT, const proc_t *restrict con closedir(PT->taskdir); } // use "path" as some tmp space - snprintf(path, PROCPATHLEN, "%s/task", PT->path); + snprintf(path, PROCPATHLEN, "/proc/%d/task", p->tgid); PT->taskdir = opendir(path); if(!PT->taskdir) return 0; PT->taskdir_user = p->tgid; @@ -679,7 +679,7 @@ static int simple_nexttid(PROCTAB *restrict const PT, const proc_t *restrict con t->tid = strtoul(ent->d_name, NULL, 10); t->tgid = p->tgid; t->ppid = p->ppid; // cover for kernel behavior? we want both actually...? - snprintf(path, PROCPATHLEN, "%s/task/%s", PT->path, ent->d_name); + snprintf(path, PROCPATHLEN, "/proc/%d/task/%s", p->tgid, ent->d_name); return 1; } diff --git a/ps/display.c b/ps/display.c index 47fd4270..a52769b4 100644 --- a/ps/display.c +++ b/ps/display.c @@ -330,19 +330,51 @@ static void simple_spew(void){ exit(1); } memset(&buf, '#', sizeof(proc_t)); - while(readproc(ptp,&buf)){ - if(want_this_proc(&buf)){ - if(thread_flags & TF_show_proc) show_one_proc(&buf, proc_format_list); - if(thread_flags & TF_show_task){ + switch(thread_flags & (TF_show_proc|TF_loose_tasks|TF_show_task)){ + case TF_show_proc: // normal non-thread output + while(readproc(ptp,&buf)){ + if(want_this_proc(&buf)){ + show_one_proc(&buf, proc_format_list); + } + if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse + if(buf.environ) free((void*)*buf.environ); // ought to reuse + } + break; + case TF_show_proc|TF_loose_tasks: // H option + while(readproc(ptp,&buf)){ + proc_t buf2; + // must still have the process allocated + while(readtask(ptp,&buf,&buf2)){ + if(!want_this_proc(&buf)) continue; + show_one_proc(&buf2, task_format_list); + } + if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse + if(buf.environ) free((void*)*buf.environ); // ought to reuse + } + break; + case TF_show_proc|TF_show_task: // m and -m options + while(readproc(ptp,&buf)){ + if(want_this_proc(&buf)){ + proc_t buf2; + show_one_proc(&buf, proc_format_list); + // must still have the process allocated + while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2, task_format_list); + } + if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse + if(buf.environ) free((void*)*buf.environ); // ought to reuse + } + break; + case TF_show_task: // -L and -T options + while(readproc(ptp,&buf)){ + if(want_this_proc(&buf)){ proc_t buf2; // must still have the process allocated while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2, task_format_list); - // must not attempt to free cmdline and environ } + if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse + if(buf.environ) free((void*)*buf.environ); // ought to reuse } - if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse - if(buf.environ) free((void*)*buf.environ); // ought to reuse -// memset(&buf, '#', sizeof(proc_t)); + break; } closeproc(ptp); } diff --git a/top.c b/top.c index 6d4ebb72..898e9b1f 100644 --- a/top.c +++ b/top.c @@ -33,7 +33,11 @@ #include #include #include + +// Foul POS defines all sorts of stuff... #include +#undef tab + #include #include #include