static unsigned int gfio_graph_limit = 100;
GdkColor gfio_color_white;
-const char *gfio_graph_font;
+const char *gfio_graph_font = GRAPH_DEFAULT_FONT;
typedef void (*clickfunction)(GtkWidget *widget, gpointer data);
},
};
-static struct graph *setup_iops_graph(void)
+static void setup_iops_graph(struct gfio_graphs *gg)
{
struct graph *g;
g = graph_new(DRAWING_AREA_XDIM / 2.0, DRAWING_AREA_YDIM, gfio_graph_font);
graph_title(g, "IOPS (IOs/sec)");
graph_x_title(g, "Time (secs)");
- graph_add_label(g, "Read IOPS");
- graph_add_label(g, "Write IOPS");
- graph_set_color(g, "Read IOPS", 0.13, 0.54, 0.13);
- graph_set_color(g, "Write IOPS", 1.0, 0.0, 0.0);
+ 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);
line_graph_set_data_count_limit(g, gfio_graph_limit);
graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0);
- return g;
+ graph_set_graph_all_zeroes(g, 0);
+ gg->iops_graph = g;
}
-static struct graph *setup_bandwidth_graph(void)
+static void setup_bandwidth_graph(struct gfio_graphs *gg)
{
struct graph *g;
g = graph_new(DRAWING_AREA_XDIM / 2.0, DRAWING_AREA_YDIM, gfio_graph_font);
graph_title(g, "Bandwidth (bytes/sec)");
graph_x_title(g, "Time (secs)");
- graph_add_label(g, "Read Bandwidth");
- graph_add_label(g, "Write Bandwidth");
- graph_set_color(g, "Read Bandwidth", 0.13, 0.54, 0.13);
- graph_set_color(g, "Write Bandwidth", 1.0, 0.0, 0.0);
+ 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);
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);
- return g;
+ graph_set_graph_all_zeroes(g, 0);
+ gg->bandwidth_graph = g;
}
static void setup_graphs(struct gfio_graphs *g)
{
- g->iops_graph = setup_iops_graph();
- g->bandwidth_graph = setup_bandwidth_graph();
+ setup_iops_graph(g);
+ setup_bandwidth_graph(g);
}
void clear_ge_ui_info(struct gui_entry *ge)
free(gc);
}
+ g_hash_table_remove(ge->ui->ge_hash, &ge->page_num);
+
free(ge->job_file);
free(ge->host);
- flist_del(&ge->list);
free(ge);
}
static void gfio_quit(struct gui *ui)
{
- struct gui_entry *ge;
-
- while (!flist_empty(&ui->list)) {
- ge = flist_entry(ui->list.next, struct gui_entry, list);
- ge_destroy(ge);
- }
-
gtk_main_quit();
}
struct gfio_client *gc = ge->client;
int ret = 0;
+ /*
+ * Prune old options, we are expecting the return options
+ * when the job file is parsed remotely and returned to us.
+ */
+ while (!flist_empty(&gc->o_list)) {
+ struct gfio_client_options *gco;
+
+ gco = flist_entry(gc->o_list.next, struct gfio_client_options, list);
+ flist_del(&gco->list);
+ free(gco);
+ }
+
ret = fio_client_send_ini(gc->client, ge->job_file);
if (!ret)
return 0;
static void gfio_client_added(struct gui_entry *ge, struct fio_client *client)
{
+ struct gfio_client_options *gco;
struct gfio_client *gc;
- gc = malloc(sizeof(*gc));
- memset(gc, 0, sizeof(*gc));
- options_default_fill(&gc->o);
+ gc = calloc(1, sizeof(*gc));
+ INIT_FLIST_HEAD(&gc->o_list);
gc->ge = ge;
ge->client = gc;
gfio_set_client(gc, client);
+
+ /*
+ * Just add a default set of options, need to consider how best
+ * to handle this
+ */
+ gco = calloc(1, sizeof(*gco));
+ INIT_FLIST_HEAD(&gco->list);
+ options_default_fill(&gco->o);
+ flist_add_tail(&gco->list, &gc->o_list);
+ gc->o_list_nr++;
}
static void connect_clicked(GtkWidget *widget, gpointer data)
ge = malloc(sizeof(*ge));
memset(ge, 0, sizeof(*ge));
ge->state = GE_STATE_NEW;
- INIT_FLIST_HEAD(&ge->list);
- flist_add_tail(&ge->list, &ui->list);
ge->ui = ui;
return ge;
}
ge->page_label = gtk_label_new(name);
ge->page_num = gtk_notebook_append_page(GTK_NOTEBOOK(ui->notebook), ge->vbox, ge->page_label);
+ g_hash_table_insert(ui->ge_hash, &ge->page_num, ge);
+
gtk_widget_show_all(ui->window);
return ge;
}
static struct gui_entry *get_ge_from_page(struct gui *ui, gint cur_page,
int *created)
{
- struct flist_head *entry;
- struct gui_entry *ge;
-
if (!cur_page) {
if (created)
*created = 1;
if (created)
*created = 0;
- flist_for_each(entry, &ui->list) {
- ge = flist_entry(entry, struct gui_entry, list);
- if (ge->page_num == cur_page)
- return ge;
- }
-
- return NULL;
+ return g_hash_table_lookup(ui->ge_hash, &cur_page);
}
static struct gui_entry *get_ge_from_cur_tab(struct gui *ui)
return;
}
- if (!flist_empty(&ui->list)) {
+ if (g_hash_table_size(ui->ge_hash)) {
gfio_report_info(ui, "Error", "The main page view cannot be closed\n");
return;
}
client = fio_client_add_explicit(&gfio_client_ops, ge->host, ge->type, ge->port);
if (client) {
+ char *label = strdup(uri);
+
+ basename(label);
+ gtk_label_set_text(GTK_LABEL(ge->page_label), basename(label));
+ free(label);
+
gfio_client_added(ge, client);
file_add_recent(ge->ui, uri);
return 0;
gfio_report_error(ge, "Failed to add client %s\n", ge->host);
free(ge->host);
ge->host = NULL;
+ free(ge->job_file);
+ ge->job_file = NULL;
return 1;
}
ge = get_ge_from_cur_tab(ui);
if (ge && ge->client)
- gopt_get_options_window(ui->window, &ge->client->o);
+ gopt_get_options_window(ui->window, ge->client);
}
static void start_job_entry(GtkWidget *w, gpointer data)
gfio_display_end_results(gc);
}
-static void __update_graph_limits(struct gfio_graphs *g)
+static void __update_graph_settings(struct gfio_graphs *g)
{
line_graph_set_data_count_limit(g->iops_graph, gfio_graph_limit);
+ graph_set_font(g->iops_graph, gfio_graph_font);
line_graph_set_data_count_limit(g->bandwidth_graph, gfio_graph_limit);
+ graph_set_font(g->bandwidth_graph, gfio_graph_font);
+}
+
+static void ge_update_settings_fn(gpointer key, gpointer value, gpointer data)
+{
+ struct gui_entry *ge = (struct gui_entry *) value;
+ GdkEvent *ev;
+
+ __update_graph_settings(&ge->graphs);
+
+ ev = gdk_event_new(GDK_EXPOSE);
+ g_signal_emit_by_name(G_OBJECT(ge->graphs.drawing_area), "expose_event", GTK_WIDGET(ge->graphs.drawing_area), ev, &ge->graphs);
+ gdk_event_free(ev);
}
static void update_graph_limits(void)
{
- struct flist_head *entry;
- struct gui_entry *ge;
+ struct gui *ui = &main_ui;
+ GdkEvent *ev;
- __update_graph_limits(&main_ui.graphs);
+ __update_graph_settings(&ui->graphs);
- flist_for_each(entry, &main_ui.list) {
- ge = flist_entry(entry, struct gui_entry, list);
- __update_graph_limits(&ge->graphs);
- }
+ ev = gdk_event_new(GDK_EXPOSE);
+ g_signal_emit_by_name(G_OBJECT(ui->graphs.drawing_area), "expose_event", GTK_WIDGET(ui->graphs.drawing_area), ev, &ui->graphs);
+ gdk_event_free(ev);
+
+ g_hash_table_foreach(ui->ge_hash, ge_update_settings_fn, NULL);
}
static void preferences(GtkWidget *w, gpointer data)
entry = gtk_label_new("Font face to use for graph labels");
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 5);
- font = gtk_font_button_new();
+ font = gtk_font_button_new_with_font(gfio_graph_font);
gtk_box_pack_start(GTK_BOX(hbox), font, FALSE, FALSE, 5);
box = gtk_vbox_new(FALSE, 6);
gtk_container_add(GTK_CONTAINER(bottom_align), ge->buttonbox);
gtk_box_pack_start(GTK_BOX(main_vbox), bottom_align, FALSE, FALSE, 0);
- add_buttons(ge, buttonspeclist, ARRAYSIZE(buttonspeclist));
+ add_buttons(ge, buttonspeclist, ARRAY_SIZE(buttonspeclist));
/*
* Set up thread status progress bar
if (fio_init_options())
return 1;
+ gopt_init();
+
memset(&main_ui, 0, sizeof(main_ui));
- INIT_FLIST_HEAD(&main_ui.list);
+ main_ui.ge_hash = g_hash_table_new(g_int_hash, g_int_equal);
init_ui(&argc, &argv, &main_ui);
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
+
+ g_hash_table_destroy(main_ui.ge_hash);
+
+ gopt_exit();
return 0;
}