gfio: add comments to interface of graph mini library
[fio.git] / gfio.c
diff --git a/gfio.c b/gfio.c
index db59f4f25df8f73e378d908793d4d79344ed6267..d2fd94aa0dd5bdd3d1afcbef9699efaa18743e67 100644 (file)
--- a/gfio.c
+++ b/gfio.c
@@ -34,6 +34,7 @@
 
 static int gfio_server_running;
 static const char *gfio_graph_font;
+static unsigned int gfio_graph_limit = 100;
 
 static void view_log(GtkWidget *w, gpointer data);
 
@@ -173,6 +174,21 @@ static void gfio_update_thread_status(struct gui_entry *ge, char *status_message
 static void gfio_update_thread_status_all(char *status_message, double perc);
 void report_error(GError *error);
 
+static void iops_graph_y_axis_unit_change(struct graph *g, int power_of_ten)
+{
+       switch (power_of_ten) {
+               case 9: graph_y_title(g, "Billions of IOs / sec");
+                       break;
+               case 6: graph_y_title(g, "Millions of IOs / sec");
+                       break;
+               case 3: graph_y_title(g, "Thousands of IOs / sec");
+                       break;
+               case 0:
+               default: graph_y_title(g, "IOs / sec");
+                       break;
+       }
+}
+
 static struct graph *setup_iops_graph(void)
 {
        struct graph *g;
@@ -185,10 +201,26 @@ static struct graph *setup_iops_graph(void)
        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);
-       line_graph_set_data_count_limit(g, 100);
+       line_graph_set_data_count_limit(g, gfio_graph_limit);
+       graph_y_axis_unit_change_notify(g, iops_graph_y_axis_unit_change);
        return g;
 }
 
+static void bandwidth_graph_y_axis_unit_change(struct graph *g, int power_of_ten)
+{
+       switch (power_of_ten) {
+               case 9: graph_y_title(g, "Petabytes / sec");
+                       break;
+               case 6: graph_y_title(g, "Gigabytes / sec");
+                       break;
+               case 3: graph_y_title(g, "Megabytes / sec");
+                       break;
+               case 0:
+               default: graph_y_title(g, "Kilobytes / sec");
+                       break;
+       }
+}
+
 static struct graph *setup_bandwidth_graph(void)
 {
        struct graph *g;
@@ -202,6 +234,7 @@ static struct graph *setup_bandwidth_graph(void)
        graph_set_color(g, "Read Bandwidth", 0.13, 0.54, 0.13);
        graph_set_color(g, "Write Bandwidth", 1.0, 0.0, 0.0);
        line_graph_set_data_count_limit(g, 100);
+       graph_y_axis_unit_change_notify(g, bandwidth_graph_y_axis_unit_change);
        return g;
 }
 
@@ -1463,6 +1496,7 @@ struct client_ops gfio_client_ops = {
        .add_job                = gfio_add_job_op,
        .timed_out              = gfio_client_timed_out,
        .stop                   = gfio_client_stop,
+       .eta_msec               = FIO_CLIENT_DEF_ETA_MSEC,
        .stay_connected         = 1,
 };
 
@@ -2021,9 +2055,29 @@ static void view_log(GtkWidget *w, gpointer data)
        gtk_widget_show_all(win);
 }
 
+static void __update_graph_limits(struct gfio_graphs *g)
+{
+       line_graph_set_data_count_limit(g->iops_graph, gfio_graph_limit);
+       line_graph_set_data_count_limit(g->bandwidth_graph, gfio_graph_limit);
+}
+
+static void update_graph_limits(void)
+{
+       struct flist_head *entry;
+       struct gui_entry *ge;
+
+       __update_graph_limits(&main_ui.graphs);
+
+       flist_for_each(entry, &main_ui.list) {
+               ge = flist_entry(entry, struct gui_entry, list);
+               __update_graph_limits(&ge->graphs);
+       }
+}
+
 static void preferences(GtkWidget *w, gpointer data)
 {
        GtkWidget *dialog, *frame, *box, **buttons, *vbox, *font;
+       GtkWidget *hbox, *spin, *entry, *spin_int;
        int i;
 
        dialog = gtk_dialog_new_with_buttons("Preferences",
@@ -2033,9 +2087,40 @@ static void preferences(GtkWidget *w, gpointer data)
                GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
                NULL);
 
-       frame = gtk_frame_new("Debug logging");
+       frame = gtk_frame_new("Graphing");
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5);
+       vbox = gtk_vbox_new(FALSE, 6);
+       gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+       hbox = gtk_hbox_new(FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+       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();
+       gtk_box_pack_start(GTK_BOX(hbox), font, FALSE, FALSE, 5);
+
+       box = gtk_vbox_new(FALSE, 6);
+       gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5);
+
+       hbox = gtk_hbox_new(FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 5);
+       entry = gtk_label_new("Maximum number of data points in graph (seconds)");
+       gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5);
 
+       spin = create_spinbutton(hbox, 10, 1000000, 100);
+
+       box = gtk_vbox_new(FALSE, 6);
+       gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5);
+
+       hbox = gtk_hbox_new(FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 5);
+       entry = gtk_label_new("Client ETA request interval (msec)");
+       gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5);
+
+       spin_int = create_spinbutton(hbox, 100, 100000, gfio_client_ops.eta_msec);
+       frame = gtk_frame_new("Debug logging");
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5);
        vbox = gtk_vbox_new(FALSE, 6);
        gtk_container_add(GTK_CONTAINER(frame), vbox);
 
@@ -2056,14 +2141,6 @@ static void preferences(GtkWidget *w, gpointer data)
                gtk_box_pack_start(GTK_BOX(box), buttons[i], FALSE, FALSE, 6);
        }
 
-       frame = gtk_frame_new("Graph font");
-       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5);
-       vbox = gtk_vbox_new(FALSE, 6);
-       gtk_container_add(GTK_CONTAINER(frame), vbox);
-
-       font = gtk_font_button_new();
-       gtk_box_pack_start(GTK_BOX(vbox), font, FALSE, FALSE, 5);
-
        gtk_widget_show_all(dialog);
 
        if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT) {
@@ -2080,6 +2157,10 @@ static void preferences(GtkWidget *w, gpointer data)
        }
 
        gfio_graph_font = strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON(font)));
+       gfio_graph_limit = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
+       update_graph_limits();
+       gfio_client_ops.eta_msec = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_int));
+
        gtk_widget_destroy(dialog);
 }