X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fcursesdisplay.c;h=01dc543a402e85f3e5abafa85680499a07d4efe6;hp=ca1e8abb3dea7f4b1472396a9b7d220d1f3a1dd7;hb=41f5890b4f45d14caf1134f0d4397fe2dd3251ea;hpb=d33aae699415eea2527e315eb441c723b8f9f4ff diff --git a/src/cursesdisplay.c b/src/cursesdisplay.c index ca1e8ab..01dc543 100644 --- a/src/cursesdisplay.c +++ b/src/cursesdisplay.c @@ -237,11 +237,21 @@ int process_selected(struct processtop *process) void update_selected_processes() { + int i; + struct processtop *stored_process; + if (process_selected(selected_process)) { - g_ptr_array_remove(selected_processes, selected_process); - print_log("Process removed"); + for (i = 0; i < selected_processes->len; i++) { + stored_process = g_ptr_array_index(selected_processes, i); + if (!stored_process) + return; + if (stored_process->tid == selected_process->tid) + g_ptr_array_remove(selected_processes, + stored_process); + print_log("Process removed"); + } } else { - g_ptr_array_add(selected_processes, selected_process); + g_ptr_array_add(selected_processes, selected_process); print_log("Process added"); } } @@ -270,7 +280,7 @@ void update_footer() print_key(footer, "Enter", "Details ", current_view == process_details); print_key(footer, "Space", "Highlight ", 0); print_key(footer, "q", "Quit ", 0); - print_key(footer, "P", "Pref ", 0); + print_key(footer, "r", "Pref ", 0); print_key(footer, "p", "Pause ", toggle_pause); wrefresh(footer); @@ -440,8 +450,8 @@ gint sort_by_process_total_desc(gconstpointer p1, gconstpointer p2) { struct processtop *n1 = *(struct processtop **)p1; struct processtop *n2 = *(struct processtop **)p2; - unsigned long totaln1 = n1->filewrite + n1->fileread; - unsigned long totaln2 = n2->filewrite + n2->fileread; + unsigned long totaln1 = n1->totalfilewrite + n1->totalfileread; + unsigned long totaln2 = n2->totalfilewrite + n2->totalfileread; if (totaln1 < totaln2) return 1; @@ -524,6 +534,7 @@ void update_cputop_display() double maxcputime; int nblinedisplayed = 0; int current_line = 0; + int column; elapsed = data->end - data->start; maxcputime = elapsed * data->cpu_table->len / 100.0; @@ -541,10 +552,14 @@ void update_cputop_display() set_window_title(center, "CPU Top"); wattron(center, A_BOLD); - mvwprintw(center, 1, 1, cputopview[0].title); - mvwprintw(center, 1, 12, cputopview[1].title); - mvwprintw(center, 1, 22, cputopview[2].title); - mvwprintw(center, 1, 32, cputopview[3].title); + column = 1; + for (i = 0; i < 4; i++) { + if (cputopview[i].sort) + wattron(center, A_UNDERLINE); + mvwprintw(center, 1, column, cputopview[i].title); + wattroff(center, A_UNDERLINE); + column += 10; + } wattroff(center, A_BOLD); max_center_lines = LINES - 5 - 7 - 1 - header_offset; @@ -567,11 +582,11 @@ void update_cputop_display() mvwprintw(center, current_line + header_offset, 1, "%1.2f", tmp->totalcpunsec / maxcputime); /* TGID */ - mvwprintw(center, current_line + header_offset, 12, "%d", tmp->pid); + mvwprintw(center, current_line + header_offset, 11, "%d", tmp->pid); /* PID */ - mvwprintw(center, current_line + header_offset, 22, "%d", tmp->tid); + mvwprintw(center, current_line + header_offset, 21, "%d", tmp->tid); /* NAME */ - mvwprintw(center, current_line + header_offset, 32, "%s", tmp->comm); + mvwprintw(center, current_line + header_offset, 31, "%s", tmp->comm); wattroff(center, COLOR_PAIR(6)); wattroff(center, COLOR_PAIR(5)); nblinedisplayed++; @@ -618,7 +633,8 @@ gint sort_perf(gconstpointer p1, gconstpointer p2, gpointer key) void print_key_title(char *key, int line) { wattron(center, A_BOLD); - mvwprintw(center, line, 1, "%s\t", key); + mvwprintw(center, line, 1, "%s", key); + mvwprintw(center, line, 30, " "); wattroff(center, A_BOLD); } @@ -631,7 +647,11 @@ void update_process_details() int i, j = 0; char unit[4]; char filename_buf[COLS]; + int line = 1; GPtrArray *newfilearray = g_ptr_array_new(); + GHashTableIter iter; + struct perfcounter *perfn1, *perfn2; + gpointer key; set_window_title(center, "Process details"); @@ -642,35 +662,43 @@ void update_process_details() elapsed = data->end - data->start; maxcputime = elapsed * data->cpu_table->len / 100.0; - print_key_title("Name", 1); + print_key_title("Name", line++); wprintw(center, "%s", selected_process->comm); - print_key_title("TID", 2); + print_key_title("TID", line++); wprintw(center, "%d", selected_process->tid); if (!tmp) { print_key_title("Does not exit at this time", 3); return; } - print_key_title("PID", 3); + print_key_title("PID", line++); wprintw(center, "%d", tmp->pid); - print_key_title("PPID", 4); + print_key_title("PPID", line++); wprintw(center, "%d", tmp->ppid); - print_key_title("CPU", 5); + print_key_title("CPU", line++); wprintw(center, "%1.2f %%", tmp->totalcpunsec/maxcputime); - print_key_title("READ B/s", 6); + print_key_title("READ B/s", line++); scale_unit(tmp->fileread, unit); wprintw(center, "%s", unit); - print_key_title("WRITE B/s", 7); + print_key_title("WRITE B/s", line++); scale_unit(tmp->filewrite, unit); wprintw(center, "%s", unit); + g_hash_table_iter_init(&iter, global_perf_liszt); + while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfn1)) { + print_key_title((char *) key, line++); + perfn2 = g_hash_table_lookup(tmp->perf, (char *) key); + wprintw(center, "%d", perfn2 ? perfn2->count : 0); + } + line++; + wattron(center, A_BOLD); - mvwprintw(center, 8, 1, "FD"); - mvwprintw(center, 8, 10, "READ"); - mvwprintw(center, 8, 17, "WRITE"); - mvwprintw(center, 8, 24, "FILENAME"); + mvwprintw(center, line, 1, "FD"); + mvwprintw(center, line, 10, "READ"); + mvwprintw(center, line, 17, "WRITE"); + mvwprintw(center, line++, 24, "FILENAME"); wattroff(center, A_BOLD); /* @@ -694,17 +722,17 @@ void update_process_details() g_ptr_array_sort(newfilearray, sort_by_file_read_desc); for (i = selected_line; i < newfilearray->len && - i < (selected_line + max_center_lines - 7); i++) { + i < (selected_line + max_center_lines - line + 2); i++) { file_tmp = g_ptr_array_index(newfilearray, i); if (!file_tmp) continue; - mvwprintw(center, 9 + j, 1, "%d", file_tmp->fd); + mvwprintw(center, line + j, 1, "%d", file_tmp->fd); scale_unit(file_tmp->read, unit); - mvwprintw(center, 9 + j, 10, "%s", unit); + mvwprintw(center, line + j, 10, "%s", unit); scale_unit(file_tmp->write, unit); - mvwprintw(center, 9 + j, 17, "%s", unit); + mvwprintw(center, line + j, 17, "%s", unit); snprintf(filename_buf, COLS - 25, "%s", file_tmp->name); - mvwprintw(center, 9 + j, 24, "%s", filename_buf); + mvwprintw(center, line + j, 24, "%s", filename_buf); j++; } g_ptr_array_free(newfilearray, TRUE); @@ -798,16 +826,23 @@ void update_iostream() int current_line = 0; int total = 0; char unit[4]; + int column; set_window_title(center, "IO Top"); wattron(center, A_BOLD); 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"); + column = 40; + for (i = 0; i < 3; i++) { + if (iostreamtopview[i].sort) + wattron(center, A_UNDERLINE); + mvwprintw(center, 1, column, iostreamtopview[i].title); + wattroff(center, A_UNDERLINE); + column += 12; + } wattroff(center, A_BOLD); + wattroff(center, A_UNDERLINE); if (iostreamtopview[0].sort == 1) g_ptr_array_sort(data->process_table, sort_by_process_read_desc); @@ -913,7 +948,7 @@ void update_process_detail_pref(int *line_selected, int toggle_view, int toggle_ set_window_title(pref_panel_window, "Process Detail Preferences "); wattron(pref_panel_window, A_BOLD); mvwprintw(pref_panel_window, size + 1, 1, - " 's' to sort"); + " 's' : sort, space : toggle"); wattroff(pref_panel_window, A_BOLD); if (*line_selected > (size - 1)) @@ -965,7 +1000,7 @@ void update_iostream_pref(int *line_selected, int toggle_view, int toggle_sort) set_window_title(pref_panel_window, "IOTop Preferences "); wattron(pref_panel_window, A_BOLD); mvwprintw(pref_panel_window, size + 1, 1, - " 's' to sort"); + " 's' : sort, space : toggle"); wattroff(pref_panel_window, A_BOLD); if (*line_selected > (size - 1)) @@ -1017,7 +1052,7 @@ void update_cpu_pref(int *line_selected, int toggle_view, int toggle_sort) set_window_title(pref_panel_window, "CPUTop Preferences "); wattron(pref_panel_window, A_BOLD); mvwprintw(pref_panel_window, size + 1, 1, - " 's' to sort"); + " 's' : sort, space : toggle"); wattroff(pref_panel_window, A_BOLD); if (*line_selected > (size - 1)) @@ -1074,7 +1109,7 @@ void update_perf_pref(int *line_selected, int toggle_view, int toggle_sort) 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"); + " 's' : sort, space : toggle"); wattroff(pref_panel_window, A_BOLD); if (toggle_sort == 1) { @@ -1264,9 +1299,11 @@ void *handle_keyboard(void *p) } else { print_log("Manually moving forward"); sem_post(&timer); - /* we force to resume the refresh when moving forward */ - if (toggle_pause > 0) - resume_display(); + if (toggle_pause > 0) { + sem_post(&pause_sem); + update_current_view(); + sem_wait(&pause_sem); + } } break; @@ -1284,6 +1321,8 @@ void *handle_keyboard(void *p) break; case 13: /* FIXME : KEY_ENTER ?? */ + if (pref_panel_visible) + break; if (current_view != process_details) { previous_view = current_view; current_view = process_details; @@ -1337,9 +1376,19 @@ void *handle_keyboard(void *p) resume_display(); } break; - case 'P': + case 'r': toggle_pref_panel(); break; + /* ESCAPE, but slow to process, don't know why */ + case 27: + if (pref_panel_visible) + toggle_pref_panel(); + else if (current_view == process_details) { + current_view = previous_view; + previous_view = process_details; + } + update_current_view(); + break; default: if (data) update_current_view();