X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Fcursesdisplay.c;h=2c6ee4e0243f21702c93fa69c995d63acaead16e;hb=0d91c12a62aa85d1d1d8b5478e81d38e06f2cc00;hp=ca49bf95c4f479de1fa36d2768b9c5400f29dc50;hpb=635dc8372a4f76c6ee13cc1381528e6ed85152c1;p=lttngtop.git diff --git a/src/cursesdisplay.c b/src/cursesdisplay.c index ca49bf9..2c6ee4e 100644 --- a/src/cursesdisplay.c +++ b/src/cursesdisplay.c @@ -38,10 +38,10 @@ sem_t update_display_sem; char *termtype; WINDOW *footer, *header, *center, *status; -WINDOW *perf_panel_window = NULL; -PANEL *perf_panel, *main_panel; +WINDOW *pref_panel_window = NULL; +PANEL *pref_panel, *main_panel; -int perf_panel_visible = 0; +int pref_panel_visible = 0; int perf_line_selected = 0; int last_display_index, currently_displayed_index; @@ -301,10 +301,37 @@ struct tm format_timestamp(uint64_t timestamp) return tm; } +static void scale_unit(uint64_t bytes, char *ret) +{ + if (bytes >= 1000000000) + sprintf(ret, "%" PRIu64 "G", bytes/1000000000); + if (bytes >= 1000000) + sprintf(ret, "%" PRIu64 "M", bytes/1000000); + else if (bytes >= 1000) + sprintf(ret, "%" PRIu64 "K", bytes/1000); + else + sprintf(ret, "%" PRIu64, bytes); +} +uint64_t total_io() +{ + int i; + struct processtop *tmp; + uint64_t total = 0; + + for (i = 0; i < data->process_table->len; i++) { + tmp = g_ptr_array_index(data->process_table, i); + total += tmp->fileread; + total += tmp->filewrite; + } + + return total; +} + void update_header() { struct tm start, end; uint64_t ts_nsec_start, ts_nsec_end; + char io[4]; ts_nsec_start = data->start % NSEC_PER_SEC; start = format_timestamp(data->start); @@ -328,7 +355,8 @@ void update_header() -1*(data->nbdeadthreads)); print_headers(3, "FDs", data->nbfiles, data->nbnewfiles, -1*(data->nbclosedfiles)); - mvwprintw(header, 3, 43, "N/A kbytes/sec"); + scale_unit(total_io(), io); + mvwprintw(header, 3, 43, "%sB/sec", io); wrefresh(header); } @@ -390,6 +418,7 @@ void update_cputop_display() nblinedisplayed < max_center_lines; i++) { tmp = g_ptr_array_index(data->process_table, i); + /* FIXME : random segfault here */ if (process_selected(tmp)) { wattron(center, COLOR_PAIR(6)); mvwhline(center, current_line + header_offset, 1, ' ', COLS-3); @@ -462,22 +491,25 @@ void update_process_details() { unsigned long elapsed; double maxcputime; - struct processtop *tmp = find_process_tid(data, - selected_process->tid, - selected_process->comm); + struct processtop *tmp; struct files *file_tmp; int i, j = 0; + char unit[4]; + char filename_buf[COLS]; set_window_title(center, "Process details"); + tmp = find_process_tid(data, + selected_process->tid, + selected_process->comm); elapsed = data->end - data->start; maxcputime = elapsed * data->cpu_table->len / 100.0; print_key_title("Name", 1); - wprintw(center, "%s", tmp->comm); + wprintw(center, "%s", selected_process->comm); print_key_title("TID", 2); - wprintw(center, "%d", tmp->tid); + wprintw(center, "%d", selected_process->tid); if (!tmp) { print_key_title("Does not exit at this time", 3); return; @@ -491,25 +523,31 @@ void update_process_details() wprintw(center, "%1.2f %%", tmp->totalcpunsec/maxcputime); print_key_title("READ B/s", 6); - wprintw(center, "%d", tmp->fileread); + scale_unit(tmp->fileread, unit); + wprintw(center, "%s", unit); print_key_title("WRITE B/s", 7); - wprintw(center, "%d", tmp->filewrite); + scale_unit(tmp->filewrite, unit); + wprintw(center, "%s", unit); wattron(center, A_BOLD); mvwprintw(center, 8, 1, "FD"); - mvwprintw(center, 8, 12, "READ"); - mvwprintw(center, 8, 22, "WRITE"); - mvwprintw(center, 8, 32, "FILENAME"); + mvwprintw(center, 8, 10, "READ"); + mvwprintw(center, 8, 17, "WRITE"); + mvwprintw(center, 8, 24, "FILENAME"); wattroff(center, A_BOLD); - for (i = 0; i < tmp->process_files_table->len; i++) { + for (i = selected_line; i < tmp->process_files_table->len && + i < (selected_line + max_center_lines - 7); i++) { file_tmp = get_file(tmp, i); if (file_tmp != NULL) { mvwprintw(center, 9 + j, 1, "%d", i); - mvwprintw(center, 9 + j, 12, "%d", file_tmp->read); - mvwprintw(center, 9 + j, 22, "%d", file_tmp->write); - mvwprintw(center, 9 + j, 32, "%s", file_tmp->name); + scale_unit(file_tmp->read, unit); + mvwprintw(center, 9 + j, 10, "%s", unit); + scale_unit(file_tmp->write, unit); + mvwprintw(center, 9 + j, 17, "%s", unit); + snprintf(filename_buf, COLS - 25, "%s", file_tmp->name); + mvwprintw(center, 9 + j, 24, "%s", filename_buf); j++; } } @@ -536,7 +574,7 @@ void update_perf() mvwprintw(center, 1, 22, "NAME"); perf_row = 40; - g_hash_table_iter_init(&iter, data->perf_list); + g_hash_table_iter_init(&iter, global_perf_liszt); while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfn1)) { if (perfn1->visible) { /* + 5 to strip the "perf_" prefix */ @@ -571,7 +609,7 @@ void update_perf() mvwprintw(center, current_line + header_offset, 11, "%d", tmp->tid); mvwprintw(center, current_line + header_offset, 22, "%s", tmp->comm); - g_hash_table_iter_init(&iter, data->perf_list); + g_hash_table_iter_init(&iter, global_perf_liszt); perf_row = 40; while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfn1)) { @@ -617,18 +655,16 @@ void update_iostream() int nblinedisplayed = 0; int current_line = 0; int total = 0; + char unit[4]; set_window_title(center, "IO Top"); wattron(center, A_BOLD); - mvwprintw(center, 1, 1, "READ (B/s)"); - mvwprintw(center, 1, 20, "WRITE (B/s)"); - - mvwprintw(center, 1, 40, "TOTAL STREAM"); - - mvwprintw(center, 1, 60, "TGID"); - mvwprintw(center, 1, 80, "PID"); - - mvwprintw(center, 1, 92, "NAME"); + mvwprintw(center, 1, 1, "PID"); + mvwprintw(center, 1, 11, "TID"); + mvwprintw(center, 1, 22, "NAME"); + mvwprintw(center, 1, 40, "R (B/sec)"); + mvwprintw(center, 1, 52, "W (B/sec)"); + mvwprintw(center, 1, 64, "Total"); wattroff(center, A_BOLD); g_ptr_array_sort(data->process_table, sort_by_ret_desc); @@ -646,34 +682,27 @@ void update_iostream() wattron(center, COLOR_PAIR(5)); mvwhline(center, current_line + header_offset, 1, ' ', COLS-3); } + /* TGID */ + mvwprintw(center, current_line + header_offset, 1, "%d", tmp->pid); + /* PID */ + mvwprintw(center, current_line + header_offset, 11, "%d", tmp->tid); + /* NAME */ + mvwprintw(center, current_line + header_offset, 22, "%s", tmp->comm); /* READ (bytes/sec) */ - mvwprintw(center, current_line + header_offset, 1, "%lu", - tmp->fileread); + scale_unit(tmp->fileread, unit); + mvwprintw(center, current_line + header_offset, 40, "%s", unit); /* WRITE (bytes/sec) */ - mvwprintw(center, current_line + header_offset, 20, "%lu", - tmp->filewrite); + scale_unit(tmp->filewrite, unit); + mvwprintw(center, current_line + header_offset, 52, "%s", unit); /* TOTAL STREAM */ total = tmp->totalfileread + tmp->totalfilewrite; - if (total >= 1000000) - mvwprintw(center, current_line + header_offset, 40, "%lu MB", - total/1000000); - else if (total >= 1000) - mvwprintw(center, current_line + header_offset, 40, "%lu KB", - total/1000); - else - mvwprintw(center, current_line + header_offset, 40, "%lu B", - total); + scale_unit(total, unit); + mvwprintw(center, current_line + header_offset, 64, "%s", unit); - /* TGID */ - mvwprintw(center, current_line + header_offset, 60, "%d", tmp->pid); - /* PID */ - mvwprintw(center, current_line + header_offset, 80, "%d", tmp->tid); - /* NAME */ - mvwprintw(center, current_line + header_offset, 92, "%s", tmp->comm); wattroff(center, COLOR_PAIR(6)); wattroff(center, COLOR_PAIR(5)); nblinedisplayed++; @@ -714,20 +743,20 @@ void update_current_view() sem_post(&update_display_sem); } -void setup_perf_panel() +void setup_pref_panel() { int size; if (!data) return; - if (perf_panel_window) { - del_panel(perf_panel); - delwin(perf_panel_window); + if (pref_panel_window) { + del_panel(pref_panel); + delwin(pref_panel_window); } - size = g_hash_table_size(data->perf_list); - perf_panel_window = create_window(size + 2, 30, 10, 10); - perf_panel = new_panel(perf_panel_window); - perf_panel_visible = 0; - hide_panel(perf_panel); + size = g_hash_table_size(global_perf_liszt); + pref_panel_window = create_window(size + 2, 30, 10, 10); + pref_panel = new_panel(pref_panel_window); + pref_panel_visible = 0; + hide_panel(pref_panel); } void update_perf_panel(int line_selected, int toggle_view, int toggle_sort) @@ -739,19 +768,19 @@ void update_perf_panel(int line_selected, int toggle_view, int toggle_sort) if (!data) return; - werase(perf_panel_window); - box(perf_panel_window, 0 , 0); - set_window_title(perf_panel_window, "Perf Preferences "); - wattron(perf_panel_window, A_BOLD); - mvwprintw(perf_panel_window, g_hash_table_size(data->perf_list) + 1, 1, + werase(pref_panel_window); + box(pref_panel_window, 0 , 0); + set_window_title(pref_panel_window, "Perf Preferences "); + wattron(pref_panel_window, A_BOLD); + mvwprintw(pref_panel_window, g_hash_table_size(global_perf_liszt) + 1, 1, " 's' to sort"); - wattroff(perf_panel_window, A_BOLD); + wattroff(pref_panel_window, A_BOLD); if (toggle_sort == 1) { i = 0; - perflist = g_list_first(g_hash_table_get_keys(data->perf_list)); + perflist = g_list_first(g_hash_table_get_keys(global_perf_liszt)); while (perflist) { - perf = g_hash_table_lookup(data->perf_list, perflist->data); + perf = g_hash_table_lookup(global_perf_liszt, perflist->data); if (i != line_selected) perf->sort = 0; else @@ -763,24 +792,24 @@ void update_perf_panel(int line_selected, int toggle_view, int toggle_sort) } i = 0; - perflist = g_list_first(g_hash_table_get_keys(data->perf_list)); + perflist = g_list_first(g_hash_table_get_keys(global_perf_liszt)); while (perflist) { - perf = g_hash_table_lookup(data->perf_list, perflist->data); + perf = g_hash_table_lookup(global_perf_liszt, perflist->data); if (i == line_selected && toggle_view == 1) { perf->visible = perf->visible == 1 ? 0:1; update_current_view(); } if (i == line_selected) { - wattron(perf_panel_window, COLOR_PAIR(5)); - mvwhline(perf_panel_window, i + 1, 1, ' ', 30 - 2); + wattron(pref_panel_window, COLOR_PAIR(5)); + mvwhline(pref_panel_window, i + 1, 1, ' ', 30 - 2); } if (perf->sort == 1) - wattron(perf_panel_window, A_BOLD); - mvwprintw(perf_panel_window, i + 1, 1, "[%c] %s", + wattron(pref_panel_window, A_BOLD); + mvwprintw(pref_panel_window, i + 1, 1, "[%c] %s", perf->visible == 1 ? 'x' : ' ', (char *) perflist->data + 5); - wattroff(perf_panel_window, A_BOLD); - wattroff(perf_panel_window, COLOR_PAIR(5)); + wattroff(pref_panel_window, A_BOLD); + wattroff(pref_panel_window, COLOR_PAIR(5)); i++; perflist = g_list_next(perflist); } @@ -788,16 +817,27 @@ void update_perf_panel(int line_selected, int toggle_view, int toggle_sort) doupdate(); } -void toggle_perf_panel(void) +void update_preference_panel(int line_selected, int toggle_view, int toggle_sort) +{ + switch(current_view) { + case perf: + update_perf_panel(line_selected, toggle_view, toggle_sort); + break; + default: + break; + } +} + +void toggle_pref_panel(void) { - if (perf_panel_visible) { - hide_panel(perf_panel); - perf_panel_visible = 0; + if (pref_panel_visible) { + hide_panel(pref_panel); + pref_panel_visible = 0; } else { - setup_perf_panel(); - update_perf_panel(perf_line_selected, 0, 0); - show_panel(perf_panel); - perf_panel_visible = 1; + setup_pref_panel(); + update_preference_panel(perf_line_selected, 0, 0); + show_panel(pref_panel); + pref_panel_visible = 1; } update_panels(); doupdate(); @@ -838,10 +878,10 @@ void *handle_keyboard(void *p) switch(ch) { /* Move the cursor and scroll */ case KEY_DOWN: - if (perf_panel_visible) { - if (perf_line_selected < g_hash_table_size(data->perf_list) - 1) + if (pref_panel_visible) { + if (perf_line_selected < g_hash_table_size(global_perf_liszt) - 1) perf_line_selected++; - update_perf_panel(perf_line_selected, 0, 0); + update_preference_panel(perf_line_selected, 0, 0); } else { if (selected_line < (max_center_lines - 1) && selected_line < max_elements - 1) { @@ -858,10 +898,10 @@ void *handle_keyboard(void *p) case KEY_NPAGE: break; case KEY_UP: - if (perf_panel_visible) { + if (pref_panel_visible) { if (perf_line_selected > 0) perf_line_selected--; - update_perf_panel(perf_line_selected, 0, 0); + update_preference_panel(perf_line_selected, 0, 0); } else { if (selected_line > 0) { selected_line--; @@ -912,16 +952,16 @@ void *handle_keyboard(void *p) break; case ' ': - if (perf_panel_visible) { - update_perf_panel(perf_line_selected, 1, 0); + if (pref_panel_visible) { + update_preference_panel(perf_line_selected, 1, 0); } else { update_selected_processes(); update_current_view(); } break; case 's': - if (perf_panel_visible) - update_perf_panel(perf_line_selected, 0, 1); + if (pref_panel_visible) + update_preference_panel(perf_line_selected, 0, 1); break; case 13: /* FIXME : KEY_ENTER ?? */ @@ -971,7 +1011,7 @@ void *handle_keyboard(void *p) } break; case 'P': - toggle_perf_panel(); + toggle_pref_panel(); break; default: if (data) @@ -997,7 +1037,7 @@ void init_ncurses() print_log("Starting display"); main_panel = new_panel(center); - setup_perf_panel(); + setup_pref_panel(); current_view = cpu; @@ -1006,4 +1046,3 @@ void init_ncurses() pthread_create(&keyboard_thread, NULL, handle_keyboard, (void *)NULL); } -