Now the list of perf counters seen during the trace is global and not
copied at each refresh. It makes less allocations and especially behaves
far better to keep settings while moving in time.
Also, the perf preference panel, is now becoming a real preference panel
specific for each view. Right now it behaves weirdly on view others than
perf, but I'm working on it now.
Signed-off-by: Julien Desfossez <julien.desfossez@efficios.com>
dst->process_table = g_ptr_array_new();
dst->files_table = g_ptr_array_new();
dst->cpu_table = g_ptr_array_new();
dst->process_table = g_ptr_array_new();
dst->files_table = g_ptr_array_new();
dst->cpu_table = g_ptr_array_new();
- dst->perf_list = g_hash_table_new(g_str_hash, g_str_equal);
- g_hash_table_foreach(lttngtop.perf_list, copy_perf_counter, dst->perf_list);
for (i = 0; i < lttngtop.process_table->len; i++) {
tmp = g_ptr_array_index(lttngtop.process_table, i);
new = g_new0(struct processtop, 1);
for (i = 0; i < lttngtop.process_table->len; i++) {
tmp = g_ptr_array_index(lttngtop.process_table, i);
new = g_new0(struct processtop, 1);
sem_t goodtodisplay, goodtoupdate, timer, pause_sem, end_trace_sem, bootstrap;
GPtrArray *copies; /* struct lttngtop */
sem_t goodtodisplay, goodtoupdate, timer, pause_sem, end_trace_sem, bootstrap;
GPtrArray *copies; /* struct lttngtop */
-pthread_mutex_t perf_list_mutex;
+GHashTable *global_perf_liszt;
char *termtype;
WINDOW *footer, *header, *center, *status;
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;
int perf_line_selected = 0;
int last_display_index, currently_displayed_index;
mvwprintw(center, 1, 22, "NAME");
perf_row = 40;
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 */
while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfn1)) {
if (perfn1->visible) {
/* + 5 to strip the "perf_" prefix */
mvwprintw(center, current_line + header_offset, 11, "%d", tmp->tid);
mvwprintw(center, current_line + header_offset, 22, "%s", tmp->comm);
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)) {
perf_row = 40;
while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfn1)) {
sem_post(&update_display_sem);
}
sem_post(&update_display_sem);
}
{
int size;
if (!data)
return;
{
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)
}
void update_perf_panel(int line_selected, int toggle_view, int toggle_sort)
- 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,
- wattroff(perf_panel_window, A_BOLD);
+ wattroff(pref_panel_window, A_BOLD);
if (toggle_sort == 1) {
i = 0;
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));
- 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
if (i != line_selected)
perf->sort = 0;
else
- perflist = g_list_first(g_hash_table_get_keys(data->perf_list));
+ perflist = g_list_first(g_hash_table_get_keys(global_perf_liszt));
- 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) {
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);
- 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);
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);
}
i++;
perflist = g_list_next(perflist);
}
-void toggle_perf_panel(void)
+void update_preference_panel(int line_selected, int toggle_view, int toggle_sort)
- if (perf_panel_visible) {
- hide_panel(perf_panel);
- perf_panel_visible = 0;
+ switch(current_view) {
+ case perf:
+ update_perf_panel(line_selected, toggle_view, toggle_sort);
+ break;
+ default:
+ break;
+ }
+}
+
+void toggle_pref_panel(void)
+{
+ if (pref_panel_visible) {
+ hide_panel(pref_panel);
+ pref_panel_visible = 0;
- 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();
}
update_panels();
doupdate();
switch(ch) {
/* Move the cursor and scroll */
case KEY_DOWN:
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)
- 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) {
} else {
if (selected_line < (max_center_lines - 1) &&
selected_line < max_elements - 1) {
case KEY_NPAGE:
break;
case KEY_UP:
case KEY_NPAGE:
break;
case KEY_UP:
- if (perf_panel_visible) {
+ if (pref_panel_visible) {
if (perf_line_selected > 0)
perf_line_selected--;
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--;
} else {
if (selected_line > 0) {
selected_line--;
- 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':
} 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 ?? */
break;
case 13: /* FIXME : KEY_ENTER ?? */
break;
default:
if (data)
break;
default:
if (data)
print_log("Starting display");
main_panel = new_panel(center);
print_log("Starting display");
main_panel = new_panel(center);
pthread_create(&keyboard_thread, NULL, handle_keyboard, (void *)NULL);
}
pthread_create(&keyboard_thread, NULL, handle_keyboard, (void *)NULL);
}
ret->visible = 1;
g_hash_table_insert(table, (gpointer) strdup(name), ret);
ret->visible = 1;
g_hash_table_insert(table, (gpointer) strdup(name), ret);
- global = g_hash_table_lookup(lttngtop.perf_list, (gpointer) name);
+ global = g_hash_table_lookup(global_perf_liszt, (gpointer) name);
if (!global) {
global = g_new0(struct perfcounter, 1);
memcpy(global, ret, sizeof(struct perfcounter));
/* by default, sort on the first perf context */
if (!global) {
global = g_new0(struct perfcounter, 1);
memcpy(global, ret, sizeof(struct perfcounter));
/* by default, sort on the first perf context */
- if (g_hash_table_size(lttngtop.perf_list) == 0)
+ if (g_hash_table_size(global_perf_liszt) == 0)
- g_hash_table_insert(lttngtop.perf_list, (gpointer) strdup(name), global);
+ g_hash_table_insert(global_perf_liszt, (gpointer) strdup(name), global);
void init_lttngtop()
{
copies = g_ptr_array_new();
void init_lttngtop()
{
copies = g_ptr_array_new();
- lttngtop.perf_list = g_hash_table_new(g_str_hash, g_str_equal);
+ global_perf_liszt = g_hash_table_new(g_str_hash, g_str_equal);
sem_init(&goodtodisplay, 0, 0);
sem_init(&goodtoupdate, 0, 1);
sem_init(&goodtodisplay, 0, 0);
sem_init(&goodtoupdate, 0, 1);
GPtrArray *process_table; /* struct processtop */
GPtrArray *files_table; /* struct files */
GPtrArray *cpu_table; /* struct cputime */
GPtrArray *process_table; /* struct processtop */
GPtrArray *files_table; /* struct files */
GPtrArray *cpu_table; /* struct cputime */
- GHashTable *perf_list; /* struct perfcounter */
unsigned long start;
unsigned long end;
unsigned int nbproc;
unsigned long start;
unsigned long end;
unsigned int nbproc;