configure: attempt to link against tcmalloc by default if available
[fio.git] / gfio.c
diff --git a/gfio.c b/gfio.c
index e44a599e416e844ff8abdb12d97f08341a2b311d..28053968515f99340f51667aaffa337bdf733ebb 100644 (file)
--- a/gfio.c
+++ b/gfio.c
  *
  *  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 <locale.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include <string.h>
+#include <libgen.h>
 
 #include <glib.h>
 #include <cairo.h>
@@ -37,7 +38,7 @@
 #include "gclient.h"
 #include "graph.h"
 
-static int gfio_server_running;
+static bool gfio_server_running;
 static unsigned int gfio_graph_limit = 100;
 
 GdkColor gfio_color_white;
@@ -88,7 +89,7 @@ static void setup_iops_graph(struct gfio_graphs *gg)
        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_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_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);
@@ -107,7 +108,7 @@ static void setup_bandwidth_graph(struct gfio_graphs *gg)
        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_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_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);
@@ -444,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;
 
@@ -459,17 +460,19 @@ static int send_job_file(struct gui_entry *ge)
 
 static void *server_thread(void *arg)
 {
-       is_backend = 1;
-       gfio_server_running = 1;
+       fio_server_create_sk_key();
+       is_backend = true;
+       gfio_server_running = true;
        fio_start_server(NULL);
-       gfio_server_running = 0;
+       gfio_server_running = false;
+       fio_server_destroy_sk_key();
        return NULL;
 }
 
 static void gfio_start_server(struct gui *ui)
 {
        if (!gfio_server_running) {
-               gfio_server_running = 1;
+               gfio_server_running = true;
                pthread_create(&ui->server_t, NULL, server_thread, NULL);
                pthread_detach(ui->server_t);
        }
@@ -654,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;
@@ -694,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));
                }
@@ -1206,7 +1216,7 @@ static void about_dialog(GtkWidget *w, gpointer data)
 {
        const char *authors[] = {
                "Jens Axboe <axboe@kernel.dk>",
-               "Stephen Carmeron <stephenmcameron@gmail.com>",
+               "Stephen Cameron <stephenmcameron@gmail.com>",
                NULL
        };
        const char *license[] = {
@@ -1231,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 <axboe@kernel.dk>",
+               "copyright", "© 2012-2017 Jens Axboe <axboe@kernel.dk>",
                "logo-icon-name", "fio",
                /* Must be last: */
                "wrap-license", TRUE,
@@ -1262,7 +1272,7 @@ static GtkActionEntry menu_items[] = {
        { "Quit", GTK_STOCK_QUIT, NULL,   "<Control>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 = " \
        <ui> \
@@ -1346,24 +1356,10 @@ static void combo_entry_destroy(GtkWidget *widget, gpointer data)
        multitext_free(&ge->eta.iodepth);
 }
 
-static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b)
-{
-       gint R, G, B;
-       gchar tmp[8];
-
-       memset(c, 0, sizeof(*c));
-       R = r * 255;
-       G = g * 255;
-       B = b * 255;
-       snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B);
-       gdk_color_parse(tmp, c);
-}
-
 static GtkWidget *new_client_page(struct gui_entry *ge)
 {
        GtkWidget *main_vbox, *probe, *probe_frame, *probe_box;
        GtkWidget *scrolled_window, *bottom_align, *top_align, *top_vbox;
-       GdkColor color;
 
        main_vbox = gtk_vbox_new(FALSE, 3);
 
@@ -1391,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");
@@ -1399,24 +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.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
-       ge->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS");
-
-       fill_color_from_rgb(&color, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
-       gtk_widget_modify_text(ge->eta.read_bw, GTK_STATE_NORMAL, &color);
-       gtk_widget_modify_text(ge->eta.read_iops, GTK_STATE_NORMAL, &color);
-
-       fill_color_from_rgb(&color, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
-       gtk_widget_modify_text(ge->eta.write_bw, GTK_STATE_NORMAL, &color);
-       gtk_widget_modify_text(ge->eta.write_iops, GTK_STATE_NORMAL, &color);
-
-       fill_color_from_rgb(&color, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
-       gtk_widget_modify_text(ge->eta.trim_bw, GTK_STATE_NORMAL, &color);
-       gtk_widget_modify_text(ge->eta.trim_iops, GTK_STATE_NORMAL, &color);
+       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
@@ -1499,13 +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.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
-       ui->eta.trim_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
@@ -1697,15 +1680,20 @@ 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();
-       gdk_color_parse("#ffffee", &gfio_color_lightyellow);
+#endif
+       gdk_color_parse("#fffff4", &gfio_color_lightyellow);
        gdk_color_parse("white", &gfio_color_white);
 
        ui->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);