static int gfio_server_running;
static const char *gfio_graph_font;
-static void gfio_update_thread_status(char *status_message, double perc);
static void view_log(GtkWidget *w, gpointer data);
#define ARRAYSIZE(x) (sizeof((x)) / (sizeof((x)[0])))
struct eta_widget eta;
pthread_t server_t;
+ pthread_t t;
+ int handler_running;
+
struct flist_head list;
} main_ui;
GtkWidget *page_label;
gint page_num;
int connected;
- pthread_t t;
struct gfio_client *client;
int nr_job_files;
struct thread_options o;
};
+static void gfio_update_thread_status(struct gui_entry *ge, char *status_message, double perc);
+static void gfio_update_thread_status_all(char *status_message, double perc);
+void report_error(GError *error);
+
static struct graph *setup_iops_graph(void)
{
struct graph *g;
sprintf(dst, " - %s", eta_str);
}
- gfio_update_thread_status(output, perc);
+ gfio_update_thread_status(ge, output, perc);
gdk_threads_leave();
}
sprintf(dst, " - %s", eta_str);
}
- gfio_update_thread_status(output, perc);
+ gfio_update_thread_status_all(output, perc);
gdk_threads_leave();
}
gdk_threads_leave();
}
-static void gfio_update_thread_status(char *status_message, double perc)
+static void gfio_update_thread_status(struct gui_entry *ge,
+ char *status_message, double perc)
+{
+ static char message[100];
+ const char *m = message;
+
+ strncpy(message, status_message, sizeof(message) - 1);
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ge->thread_status_pb), m);
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ge->thread_status_pb), perc / 100.0);
+ gtk_widget_queue_draw(main_ui.window);
+}
+
+static void gfio_update_thread_status_all(char *status_message, double perc)
{
struct gui *ui = &main_ui;
static char message[100];
static void *job_thread(void *arg)
{
+ struct gui *ui = arg;
+
+ ui->handler_running = 1;
fio_handle_clients(&gfio_client_ops);
+ ui->handler_running = 0;
return NULL;
}
static int send_job_files(struct gui_entry *ge)
{
+ struct gfio_client *gc = ge->client;
int i, ret = 0;
for (i = 0; i < ge->nr_job_files; i++) {
- ret = fio_clients_send_ini(ge->job_files[i]);
- if (ret)
+ ret = fio_client_send_ini(gc->client, ge->job_files[i]);
+ if (ret < 0) {
+ GError *error;
+
+ error = g_error_new(g_quark_from_string("fio"), 1, "Failed to send file %s: %s\n", ge->job_files[i], strerror(-ret));
+ report_error(error);
+ g_error_free(error);
+ break;
+ } else if (ret)
break;
free(ge->job_files[i]);
struct gfio_client *gc = ge->client;
if (!ge->connected) {
+ int ret;
+
if (!ge->nr_job_files)
file_open(widget, data);
if (!ge->nr_job_files)
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ge->thread_status_pb), "No jobs running");
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ge->thread_status_pb), 0.0);
- if (!fio_client_connect(gc->client)) {
- pthread_create(&ge->t, NULL, job_thread, NULL);
+ ret = fio_client_connect(gc->client);
+ if (!ret) {
+ if (!ge->ui->handler_running)
+ pthread_create(&ge->ui->t, NULL, job_thread, ge->ui);
gtk_widget_set_sensitive(ge->button[CONNECT_BUTTON], 0);
gtk_widget_set_sensitive(ge->button[SEND_BUTTON], 1);
+ } else {
+ GError *error;
+
+ error = g_error_new(g_quark_from_string("fio"), 1, "Failed to connect to %s: %s\n", ge->client->client->hostname, strerror(-ret));
+ report_error(error);
+ g_error_free(error);
}
} else {
fio_client_terminate(gc->client);
struct gui_entry *ge = data;
if (send_job_files(ge)) {
- printf("Yeah, I didn't really like those options too much.\n");
+ GError *error;
+
+ error = g_error_new(g_quark_from_string("fio"), 1, "Failed to send one or more job files for client %s", ge->client->client->hostname);
+ report_error(error);
+ g_error_free(error);
+
gtk_widget_set_sensitive(ge->button[START_JOB_BUTTON], 1);
}
gc = malloc(sizeof(*gc));
memset(gc, 0, sizeof(*gc));
gc->ge = ge;
- gc->client = client;
+ gc->client = fio_get_client(client);
ge->client = gc;
static void ge_destroy(GtkWidget *w, gpointer data)
{
struct gui_entry *ge = data;
+ struct gfio_client *gc = ge->client;
+
+ if (gc->client)
+ fio_put_client(gc->client);
flist_del(&ge->list);
free(ge);
ui->notebook = gtk_notebook_new();
g_signal_connect(ui->notebook, "switch-page", G_CALLBACK(notebook_switch_page), ui);
+ gtk_notebook_set_scrollable(GTK_NOTEBOOK(ui->notebook), 1);
gtk_container_add(GTK_CONTAINER(ui->vbox), ui->notebook);
vbox = new_main_page(ui);