From fd64c5d07e92c54c8944576e9674555672743645 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 1 Mar 2016 13:01:23 -0800 Subject: [PATCH] Make toolbox top a little more like everyone else's. The use of PR to mean PSR rather than PR was confusing, so let's just use PR and NI the same way everyone else does. Also remove bogus blank lines and unnecessary delays (both before first showing anything and after having shown the final iteration). Bug: http://b/27447491 Change-Id: I676131956facf2167abb5d0852c55b0670b5eaa6 --- toolbox/top.c | 62 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/toolbox/top.c b/toolbox/top.c index 0ea5a5e75..6fda13232 100644 --- a/toolbox/top.c +++ b/toolbox/top.c @@ -62,12 +62,13 @@ struct proc_info { char state; uint64_t utime; uint64_t stime; + char pr[3]; + long ni; uint64_t delta_utime; uint64_t delta_stime; uint64_t delta_time; uint64_t vss; uint64_t rss; - int prs; int num_threads; char policy[POLICY_NAME_LEN]; }; @@ -183,11 +184,11 @@ int top_main(int argc, char *argv[]) { old_procs = new_procs; num_old_procs = num_new_procs; memcpy(&old_cpu, &new_cpu, sizeof(old_cpu)); - sleep(delay); read_procs(); print_procs(); free_old_procs(); fflush(stdout); + if (iterations != 0) sleep(delay); } return 0; @@ -339,20 +340,30 @@ static int read_stat(char *filename, struct proc_info *proc) { strncpy(proc->tname, open_paren + 1, THREAD_NAME_LEN); proc->tname[THREAD_NAME_LEN-1] = 0; - /* Scan rest of string. */ + // Scan rest of string. + long pr; sscanf(close_paren + 1, - " %c " "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d " - "%" SCNu64 - "%" SCNu64 "%*d %*d %*d %*d %*d %*d %*d " - "%" SCNu64 - "%" SCNu64 "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d " - "%d", + " %c " + "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d " + "%" SCNu64 // utime %lu (14) + "%" SCNu64 // stime %lu (15) + "%*d %*d " + "%ld " // priority %ld (18) + "%ld " // nice %ld (19) + "%*d %*d %*d " + "%" SCNu64 // vsize %lu (23) + "%" SCNu64, // rss %ld (24) &proc->state, &proc->utime, &proc->stime, + &pr, + &proc->ni, &proc->vss, - &proc->rss, - &proc->prs); + &proc->rss); + + // Translate the PR field. + if (pr < -9) strcpy(proc->pr, "RT"); + else snprintf(proc->pr, sizeof(proc->pr), "%ld", pr); return 0; } @@ -414,11 +425,10 @@ static int read_status(char *filename, struct proc_info *proc) { } static void print_procs(void) { + static int call = 0; int i; struct proc_info *old_proc, *proc; long unsigned total_delta_time; - struct passwd *user; - char *user_str, user_buf[20]; for (i = 0; i < num_new_procs; i++) { if (new_procs[i]) { @@ -441,7 +451,7 @@ static void print_procs(void) { qsort(new_procs, num_new_procs, sizeof(struct proc_info *), proc_cmp); - printf("\n\n\n"); + if (call++ > 0) printf("\n\n\n"); printf("User %ld%%, System %ld%%, IOW %ld%%, IRQ %ld%%\n", ((new_cpu.utime + new_cpu.ntime) - (old_cpu.utime + old_cpu.ntime)) * 100 / total_delta_time, ((new_cpu.stime ) - (old_cpu.stime)) * 100 / total_delta_time, @@ -459,16 +469,18 @@ static void print_procs(void) { total_delta_time); printf("\n"); if (!threads) - printf("%5s %2s %4s %1s %5s %7s %7s %3s %-8s %s\n", "PID", "PR", "CPU%", "S", "#THR", "VSS", "RSS", "PCY", "UID", "Name"); + printf("%5s %-8s %2s %3s %4s %1s %5s %7s %7s %3s %s\n", "PID", "USER", "PR", "NI", "CPU%", "S", "#THR", "VSS", "RSS", "PCY", "Name"); else - printf("%5s %5s %2s %4s %1s %7s %7s %3s %-8s %-15s %s\n", "PID", "TID", "PR", "CPU%", "S", "VSS", "RSS", "PCY", "UID", "Thread", "Proc"); + printf("%5s %5s %-8s %2s %3s %4s %1s %7s %7s %3s %-15s %s\n", "PID", "TID", "USER", "PR", "NI", "CPU%", "S", "VSS", "RSS", "PCY", "Thread", "Proc"); for (i = 0; i < num_new_procs; i++) { proc = new_procs[i]; if (!proc || (max_procs && (i >= max_procs))) break; - user = getpwuid(proc->uid); + struct passwd* user = getpwuid(proc->uid); + char user_buf[20]; + char* user_str; if (user && user->pw_name) { user_str = user->pw_name; } else { @@ -476,13 +488,17 @@ static void print_procs(void) { user_str = user_buf; } if (!threads) { - printf("%5d %2d %3" PRIu64 "%% %c %5d %6" PRIu64 "K %6" PRIu64 "K %3s %-8.8s %s\n", - proc->pid, proc->prs, proc->delta_time * 100 / total_delta_time, proc->state, proc->num_threads, - proc->vss / 1024, proc->rss * getpagesize() / 1024, proc->policy, user_str, proc->name[0] != 0 ? proc->name : proc->tname); + printf("%5d %-8.8s %2s %3ld %3" PRIu64 "%% %c %5d %6" PRIu64 "K %6" PRIu64 "K %3s %s\n", + proc->pid, user_str, proc->pr, proc->ni, + proc->delta_time * 100 / total_delta_time, proc->state, proc->num_threads, + proc->vss / 1024, proc->rss * getpagesize() / 1024, proc->policy, + proc->name[0] != 0 ? proc->name : proc->tname); } else { - printf("%5d %5d %2d %3" PRIu64 "%% %c %6" PRIu64 "K %6" PRIu64 "K %3s %-8.8s %-15s %s\n", - proc->pid, proc->tid, proc->prs, proc->delta_time * 100 / total_delta_time, proc->state, - proc->vss / 1024, proc->rss * getpagesize() / 1024, proc->policy, user_str, proc->tname, proc->name); + printf("%5d %5d %-8.8s %2s %3ld %3" PRIu64 "%% %c %6" PRIu64 "K %6" PRIu64 "K %3s %-15s %s\n", + proc->pid, proc->tid, user_str, proc->pr, proc->ni, + proc->delta_time * 100 / total_delta_time, proc->state, + proc->vss / 1024, proc->rss * getpagesize() / 1024, proc->policy, + proc->tname, proc->name); } } }