From 9b260bdfc79dfc55855ffddce15ac1ca7025376f Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 6 Mar 2012 11:02:52 +0100 Subject: [PATCH] gfio: add log viewer Replaces old text_op. Signed-off-by: Jens Axboe --- gfio.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/gfio.c b/gfio.c index c7160ada..3f01682a 100644 --- a/gfio.c +++ b/gfio.c @@ -90,6 +90,8 @@ struct gui { GtkWidget *error_label; GtkWidget *results_notebook; GtkWidget *results_window; + GtkListStore *log_model; + GtkWidget *log_tree; GtkTextBuffer *text; struct probe_widget probe; struct eta_widget eta; @@ -235,6 +237,29 @@ GtkTreeViewColumn *tree_view_column(GtkWidget *tree_view, int index, const char return col; } +static void gfio_ui_setup_log(struct gui *ui) +{ + GtkTreeSelection *selection; + GtkListStore *model; + GtkWidget *tree_view; + + model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING); + + tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + gtk_widget_set_can_focus(tree_view, FALSE); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); + gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); + + tree_view_column(tree_view, 0, "Time", ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, 1, "Host", ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, 2, "Level", ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, 3, "Text", ALIGN_RIGHT | UNSORTABLE); + + ui->log_model = model; + ui->log_tree = tree_view; +} + static GtkWidget *gfio_output_clat_percentiles(unsigned int *ovals, fio_fp64_t *plist, unsigned int len, @@ -779,20 +804,27 @@ static void gfio_display_ts(struct fio_client *client, struct thread_stat *ts, static void gfio_text_op(struct fio_client *client, struct fio_net_cmd *cmd) { -#if 0 - GtkTextBuffer *buffer; - GtkTextIter end; + struct cmd_text_pdu *p = (struct cmd_text_pdu *) cmd->payload; + struct gui *ui = client->client_data; + GtkTreeIter iter; + struct tm *tm; + time_t sec; + char tmp[64], timebuf[80]; + + sec = p->log_sec; + tm = localtime(&sec); + strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", tm); + sprintf(timebuf, "%s.%03ld", tmp, p->log_usec / 1000); - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ui.textview)); gdk_threads_enter(); - gtk_text_buffer_get_end_iter(buffer, &end); - gtk_text_buffer_insert(buffer, &end, buf, -1); + + gtk_list_store_append(ui->log_model, &iter); + gtk_list_store_set(ui->log_model, &iter, 0, timebuf, -1); + gtk_list_store_set(ui->log_model, &iter, 1, client->hostname, -1); + gtk_list_store_set(ui->log_model, &iter, 2, p->level, -1); + gtk_list_store_set(ui->log_model, &iter, 3, p->buf, -1); + gdk_threads_leave(); - gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(ui.textview), - &end, 0.0, FALSE, 0.0,0.0); -#else - fio_client_ops.text_op(client, cmd); -#endif } static void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd) @@ -1342,6 +1374,31 @@ static void file_save(GtkWidget *w, gpointer data) gtk_widget_destroy(dialog); } +static void view_log_destroy(GtkWidget *w, gpointer data) +{ + struct gui *ui = (struct gui *) data; + + gtk_widget_ref(ui->log_tree); + gtk_container_remove(GTK_CONTAINER(w), ui->log_tree); + gtk_widget_destroy(w); +} + +static void view_log(GtkWidget *w, gpointer data) +{ + GtkWidget *win, *box; + + win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(win), "Log"); + + box = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(win), box); + + g_signal_connect(box, "delete-event", G_CALLBACK(view_log_destroy), (gpointer) &ui); + g_signal_connect(box, "destroy", G_CALLBACK(view_log_destroy), (gpointer) &ui); + gtk_container_add(GTK_CONTAINER(box), ui.log_tree); + gtk_widget_show_all(win); +} + static void preferences(GtkWidget *w, gpointer data) { GtkWidget *dialog, *frame, *box, **buttons; @@ -1401,10 +1458,12 @@ static void about_dialog(GtkWidget *w, gpointer data) static GtkActionEntry menu_items[] = { { "FileMenuAction", GTK_STOCK_FILE, "File", NULL, NULL, NULL}, + { "ViewMenuAction", GTK_STOCK_FILE, "View", NULL, NULL, NULL}, { "HelpMenuAction", GTK_STOCK_HELP, "Help", NULL, NULL, NULL}, { "OpenFile", GTK_STOCK_OPEN, NULL, "O", NULL, G_CALLBACK(file_open) }, { "SaveFile", GTK_STOCK_SAVE, NULL, "S", NULL, G_CALLBACK(file_save) }, { "Preferences", GTK_STOCK_PREFERENCES, NULL, "p", NULL, G_CALLBACK(preferences) }, + { "ViewLog", NULL, "Log", "l", NULL, G_CALLBACK(view_log) }, { "Quit", GTK_STOCK_QUIT, NULL, "Q", NULL, G_CALLBACK(quit_clicked) }, { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(about_dialog) }, }; @@ -1421,6 +1480,9 @@ static const gchar *ui_string = " \ \ \ \ + \ + \ + \ \ \ \ @@ -1571,6 +1633,7 @@ static void init_ui(int *argc, char **argv[], struct gui *ui) gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ui->thread_status_pb), "No connections"); gtk_container_add(GTK_CONTAINER(ui->buttonbox), ui->thread_status_pb); + gfio_ui_setup_log(ui); gtk_widget_show_all(ui->window); } -- 2.25.1