X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gfio.c;h=f59238cd29c816e80b5952333e6794d377c47460;hp=559c7bd35b37af65bdc2406c1d80451010700086;hb=2eca48926723d3ebe8f43d4999302fb826f4a250;hpb=b6ab6a31f82cf498da9da08ce83f7b12160203fe diff --git a/gfio.c b/gfio.c index 559c7bd3..f59238cd 100644 --- a/gfio.c +++ b/gfio.c @@ -1,7 +1,7 @@ /* * gfio - gui front end for fio - the flexible io tester * - * Copyright (C) 2012 Stephen M. Cameron + * Copyright (C) 2012 Stephen M. Cameron * Copyright (C) 2012 Jens Axboe * * The license below covers all files distributed with fio unless otherwise @@ -18,12 +18,13 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include -#include +#include #include +#include #include #include @@ -41,6 +42,7 @@ static int gfio_server_running; static unsigned int gfio_graph_limit = 100; GdkColor gfio_color_white; +GdkColor gfio_color_lightyellow; const char *gfio_graph_font = GRAPH_DEFAULT_FONT; typedef void (*clickfunction)(GtkWidget *widget, gpointer data); @@ -84,8 +86,10 @@ static void setup_iops_graph(struct gfio_graphs *gg) graph_x_title(g, "Time (secs)"); gg->read_iops = graph_add_label(g, "Read IOPS"); gg->write_iops = graph_add_label(g, "Write IOPS"); - graph_set_color(g, gg->read_iops, 0.13, 0.54, 0.13); - graph_set_color(g, gg->write_iops, 1.0, 0.0, 0.0); + gg->trim_iops = graph_add_label(g, "Trim IOPS"); + graph_set_color(g, gg->read_iops, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + graph_set_color(g, gg->write_iops, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + graph_set_color(g, gg->trim_iops, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); line_graph_set_data_count_limit(g, gfio_graph_limit); graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0); graph_set_graph_all_zeroes(g, 0); @@ -101,8 +105,10 @@ static void setup_bandwidth_graph(struct gfio_graphs *gg) graph_x_title(g, "Time (secs)"); gg->read_bw = graph_add_label(g, "Read Bandwidth"); gg->write_bw = graph_add_label(g, "Write Bandwidth"); - graph_set_color(g, gg->read_bw, 0.13, 0.54, 0.13); - graph_set_color(g, gg->write_bw, 1.0, 0.0, 0.0); + gg->trim_bw = graph_add_label(g, "Trim Bandwidth"); + graph_set_color(g, gg->read_bw, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + graph_set_color(g, gg->write_bw, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + graph_set_color(g, gg->trim_bw, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); graph_set_base_offset(g, 1); line_graph_set_data_count_limit(g, 100); graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0); @@ -293,7 +299,7 @@ static void gfio_ui_setup_log(struct gui *ui) GtkListStore *model; GtkWidget *tree_view; - model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING); + model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); gtk_widget_set_can_focus(tree_view, FALSE); @@ -406,11 +412,11 @@ static void ge_widget_destroy(GtkWidget *w, gpointer data) static void gfio_quit(struct gui *ui) { - gtk_main_quit(); + gtk_main_quit(); } static void quit_clicked(__attribute__((unused)) GtkWidget *widget, - __attribute__((unused)) gpointer data) + gpointer data) { struct gui *ui = (struct gui *) data; @@ -439,12 +445,12 @@ static int send_job_file(struct gui_entry *ge) while (!flist_empty(&gc->o_list)) { struct gfio_client_options *gco; - gco = flist_entry(gc->o_list.next, struct gfio_client_options, list); + gco = flist_first_entry(&gc->o_list, struct gfio_client_options, list); flist_del(&gco->list); free(gco); } - ret = fio_client_send_ini(gc->client, ge->job_file); + ret = fio_client_send_ini(gc->client, ge->job_file, false); if (!ret) return 0; @@ -454,10 +460,12 @@ static int send_job_file(struct gui_entry *ge) static void *server_thread(void *arg) { + fio_server_create_sk_key(); is_backend = 1; gfio_server_running = 1; fio_start_server(NULL); gfio_server_running = 0; + fio_server_destroy_sk_key(); return NULL; } @@ -471,7 +479,7 @@ static void gfio_start_server(struct gui *ui) } static void start_job_clicked(__attribute__((unused)) GtkWidget *widget, - gpointer data) + gpointer data) { struct gui_entry *ge = data; struct gfio_client *gc = ge->client; @@ -649,6 +657,12 @@ static void gfio_client_added(struct gui_entry *ge, struct fio_client *client) gc->o_list_nr++; } +static void gfio_clear_graph_data(struct gfio_graphs *g) +{ + graph_clear_values(g->iops_graph); + graph_clear_values(g->bandwidth_graph); +} + static void connect_clicked(GtkWidget *widget, gpointer data) { struct gui_entry *ge = data; @@ -689,6 +703,7 @@ static void connect_clicked(GtkWidget *widget, gpointer data) if (!ge->ui->handler_running) pthread_create(&ge->ui->t, NULL, job_thread, ge->ui); gfio_set_state(ge, GE_STATE_CONNECTED); + gfio_clear_graph_data(&ge->graphs); } else { gfio_report_error(ge, "Failed to connect to %s: %s\n", ge->client->client->hostname, strerror(-ret)); } @@ -876,7 +891,7 @@ static int do_file_open_with_tab(struct gui *ui, const gchar *uri) if (get_connection_details(ge)) { if (ge_is_new) gtk_widget_destroy(ge->vbox); - + return 1; } @@ -1016,7 +1031,7 @@ static void connect_job_entry(GtkWidget *w, gpointer data) { struct gui *ui = (struct gui *) data; struct gui_entry *ge; - + ge = get_ge_from_cur_tab(ui); if (ge) connect_clicked(w, ge); @@ -1201,7 +1216,7 @@ static void about_dialog(GtkWidget *w, gpointer data) { const char *authors[] = { "Jens Axboe ", - "Stephen Carmeron ", + "Stephen Cameron ", NULL }; const char *license[] = { @@ -1226,10 +1241,10 @@ static void about_dialog(GtkWidget *w, gpointer data) "program-name", "gfio", "comments", "Gtk2 UI for fio", "license", license_trans, - "website", "http://git.kernel.dk/?p=fio.git;a=summary", + "website", "http://git.kernel.dk/cgit/fio/", "authors", authors, "version", fio_version_string, - "copyright", "© 2012 Jens Axboe ", + "copyright", "© 2012-2017 Jens Axboe ", "logo-icon-name", "fio", /* Must be last: */ "wrap-license", TRUE, @@ -1257,7 +1272,7 @@ static GtkActionEntry menu_items[] = { { "Quit", GTK_STOCK_QUIT, NULL, "Q", NULL, G_CALLBACK(quit_clicked) }, { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(about_dialog) }, }; -static gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); +static gint nmenu_items = ARRAY_SIZE(menu_items); static const gchar *ui_string = " \ \ @@ -1372,7 +1387,7 @@ static GtkWidget *new_client_page(struct gui_entry *ge) g_signal_connect(ge->eta.names, "changed", G_CALLBACK(combo_entry_changed), ge); g_signal_connect(ge->eta.names, "destroy", G_CALLBACK(combo_entry_destroy), ge); ge->eta.iotype.entry = new_info_entry_in_frame(probe_box, "IO"); - ge->eta.bs.entry = new_info_entry_in_frame(probe_box, "Blocksize (Read/Write)"); + ge->eta.bs.entry = new_info_entry_in_frame(probe_box, "Blocksize (Read/Write/Trim)"); ge->eta.ioengine.entry = new_info_entry_in_frame(probe_box, "IO Engine"); ge->eta.iodepth.entry = new_info_entry_in_frame(probe_box, "IO Depth"); ge->eta.jobs = new_info_entry_in_frame(probe_box, "Jobs"); @@ -1380,10 +1395,12 @@ static GtkWidget *new_client_page(struct gui_entry *ge) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); - ge->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW"); - ge->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ge->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW"); - ge->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS"); + ge->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ge->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "Read IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ge->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ge->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "Write IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ge->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); + ge->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "Trim IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); /* * Only add this if we have a commit rate @@ -1405,7 +1422,7 @@ static GtkWidget *new_client_page(struct gui_entry *ge) ge->graphs.drawing_area = gtk_drawing_area_new(); gtk_widget_set_size_request(GTK_WIDGET(ge->graphs.drawing_area), DRAWING_AREA_XDIM, DRAWING_AREA_YDIM); - gtk_widget_modify_bg(ge->graphs.drawing_area, GTK_STATE_NORMAL, &gfio_color_white); + gtk_widget_modify_bg(ge->graphs.drawing_area, GTK_STATE_NORMAL, &gfio_color_lightyellow); g_signal_connect(G_OBJECT(ge->graphs.drawing_area), GFIO_DRAW_EVENT, G_CALLBACK(on_expose_drawing_area), &ge->graphs); g_signal_connect(G_OBJECT(ge->graphs.drawing_area), "configure_event", @@ -1420,7 +1437,7 @@ static GtkWidget *new_client_page(struct gui_entry *ge) setup_graphs(&ge->graphs); /* - * Set up alignments for widgets at the bottom of ui, + * Set up alignments for widgets at the bottom of ui, * align bottom left, expand horizontally but not vertically */ bottom_align = gtk_alignment_new(0, 1, 1, 0); @@ -1466,10 +1483,12 @@ static GtkWidget *new_main_page(struct gui *ui) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); ui->eta.jobs = new_info_entry_in_frame(probe_box, "Running"); - ui->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW"); - ui->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ui->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW"); - ui->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS"); + ui->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ui->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ui->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ui->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ui->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); + ui->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); /* * Only add this if we have a commit rate @@ -1491,7 +1510,7 @@ static GtkWidget *new_main_page(struct gui *ui) ui->graphs.drawing_area = gtk_drawing_area_new(); gtk_widget_set_size_request(GTK_WIDGET(ui->graphs.drawing_area), DRAWING_AREA_XDIM, DRAWING_AREA_YDIM); - gtk_widget_modify_bg(ui->graphs.drawing_area, GTK_STATE_NORMAL, &gfio_color_white); + gtk_widget_modify_bg(ui->graphs.drawing_area, GTK_STATE_NORMAL, &gfio_color_lightyellow); g_signal_connect(G_OBJECT(ui->graphs.drawing_area), GFIO_DRAW_EVENT, G_CALLBACK(on_expose_drawing_area), &ui->graphs); g_signal_connect(G_OBJECT(ui->graphs.drawing_area), "configure_event", @@ -1507,7 +1526,7 @@ static GtkWidget *new_main_page(struct gui *ui) setup_graphs(&ui->graphs); /* - * Set up alignments for widgets at the bottom of ui, + * Set up alignments for widgets at the bottom of ui, * align bottom left, expand horizontally but not vertically */ bottom_align = gtk_alignment_new(0, 1, 1, 0); @@ -1661,16 +1680,22 @@ static void init_ui(int *argc, char **argv[], struct gui *ui) * Without it, the update that happens in gfio_update_thread_status * doesn't really happen in a timely fashion, you need expose events */ +#if !GLIB_CHECK_VERSION(2, 31, 0) if (!g_thread_supported()) g_thread_init(NULL); +#endif + gdk_threads_init(); gtk_init(argc, argv); settings = gtk_settings_get_default(); gtk_settings_set_long_property(settings, "gtk_tooltip_timeout", 10, "gfio setting"); +#if !GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); +#endif + gdk_color_parse("#fffff4", &gfio_color_lightyellow); gdk_color_parse("white", &gfio_color_white); - + ui->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(ui->window), "fio"); gtk_window_set_default_size(GTK_WINDOW(ui->window), 1024, 768);