From 722990204fbb05b3581e03acffca127fbbe78c5a Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Sun, 2 Oct 2011 12:10:38 +0300 Subject: [PATCH] Print verbose output during operation Sometimes (especially with slower computers with a lot of memory, or just computers with *a lot* of memory) it can take quite a while until all the processing is done. Print brief status notes to the user stating which pid's data we are now processing. This allows the user to know how far we are going. Signed-off-by: Timo Kokkonen --- analyze.c | 12 ++++++++++++ main.c | 4 ++++ parse.c | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/analyze.c b/analyze.c index 4c1b542..57d0869 100644 --- a/analyze.c +++ b/analyze.c @@ -179,6 +179,8 @@ void print_page_stats(struct pageframe *pf) count = bintree_walk(&pf->tree, &af.ops); + printf("\n"); + for (i = 0; i < KPAGEFLAGS_NUM; i++) { if (!af.kpageflag[i]) continue; @@ -216,12 +218,19 @@ void print_pid_stats(struct pageframe *pf, struct process *process_list, long int swapped, present, unique, total; long int biggest = 0, second_biggest; int count, processes = 0; + int len = 0, i; /* * walk through all processes, find the one with most present * pages */ + printf("\rAnalyzing pages for process: "); list_for_each_entry(ps, &process_list->list, list) { + for (i = 0; i < len; i++) + putchar('\b'); + len = printf("% 5d", ps->pid); + fflush(stdout); + memset(&af, 0, sizeof(af)); af.ops.callback = count_pages; af.pid = ps->pid; @@ -232,6 +241,9 @@ void print_pid_stats(struct pageframe *pf, struct process *process_list, ps->pages_unique = af.pages_unique; biggest = MAX(biggest, ps->pages_present + ps->pages_swapped); } + for (i = 0; i < len; i++) + putchar('\b'); + printf("Done \n\n"); printf(" RSS swapped USS total pid"); if (opts->with_threads) diff --git a/main.c b/main.c index 10f1a9e..2142e5a 100644 --- a/main.c +++ b/main.c @@ -172,11 +172,15 @@ int main(int argc, char *argv[]) memset(&process_list, 0, sizeof(process_list)); INIT_LIST_HEAD(&process_list.list); + printf("Scanning all process IDs\n"); + if (scan_all_pids(&pf, &process_list, &opts)) return 1; + printf("Updating kpageflags\n"); update_kpageflags(&pf); + printf("Preparing to print out results\n"); if (opts.parse_mask & PARSE_DUMP) dump_process_maps(&pf, &process_list, &opts); else diff --git a/parse.c b/parse.c index 5f3196c..5e29ea5 100644 --- a/parse.c +++ b/parse.c @@ -379,6 +379,7 @@ int scan_all_pids(struct pageframe *pf, struct process *process_list, DIR *dir = NULL; int pid; int count = 0; + int len = 0, i; if (is_parse_option(opts, PARSE_PID)) { list_for_each_entry_safe(pidlist, n, &opts->pidlist, list) { @@ -398,23 +399,45 @@ int scan_all_pids(struct pageframe *pf, struct process *process_list, if (is_parse_option(opts, PARSE_MAP_NAME) && !is_parse_option(opts, PARSE_PID)) { + printf("Scanning page mappings for process: "); while (1) { pid = get_next_pid(&dir); if (pid <= 0) break; + + for (i = 0; i < len; i++) + putchar('\b'); + len = printf("% 5d", pid); + fflush(stdout); + read_pageframe_with_threads(pid, pf, process_list, opts); } + + for (i = 0; i < len; i++) + putchar('\b'); + printf("Done \n"); + len = 0; } /* Do not add new pages in the tree after the initial scan */ opts->parse_mask |= PARSE_NOADD_TREE; + printf("Scanning page mappings for process: "); while (1) { pid = get_next_pid(&dir); if (pid <= 0) break; + + for (i = 0; i < len; i++) + putchar('\b'); + len = printf("% 5d", pid); + fflush(stdout); + read_pageframe_with_threads(pid, pf, process_list, opts); } + for (i = 0; i < len; i++) + putchar('\b'); + printf("Done \n"); return 0; } -- 2.44.0