gtk_widget_queue_draw(ui->window);
}
-static void gfio_quit_op(struct fio_client *client)
+static void gfio_quit_op(struct fio_client *client, struct fio_net_cmd *cmd)
{
struct gfio_client *gc = client->client_data;
gdk_threads_leave();
}
+static void gfio_client_iolog(struct fio_client *client, struct cmd_iolog_pdu *pdu)
+{
+ free(pdu);
+}
+
struct client_ops gfio_client_ops = {
- .text_op = gfio_text_op,
+ .text = gfio_text_op,
.disk_util = gfio_disk_util_op,
.thread_status = gfio_thread_status_op,
.group_stats = gfio_group_stats_op,
.stop = gfio_client_stop,
.start = gfio_client_start,
.job_start = gfio_client_job_start,
+ .iolog = gfio_client_iolog,
.eta_msec = FIO_CLIENT_DEF_ETA_MSEC,
.stay_connected = 1,
+ .client_type = FIO_CLIENT_TYPE_GUI,
};
+/*
+ * FIXME: need more handling here
+ */
+static void ge_destroy(struct gui_entry *ge)
+{
+ struct gfio_client *gc = ge->client;
+
+ if (gc && gc->client) {
+ if (ge->state >= GE_STATE_CONNECTED)
+ fio_client_terminate(gc->client);
+
+ fio_put_client(gc->client);
+ }
+
+ flist_del(&ge->list);
+ free(ge);
+}
+
+static void ge_widget_destroy(GtkWidget *w, gpointer data)
+{
+ struct gui_entry *ge = data;
+
+ /*
+ * Why are we getting NULL data here sometimes?
+ */
+ if (ge)
+ ge_destroy(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();
+}
+
static void quit_clicked(__attribute__((unused)) GtkWidget *widget,
__attribute__((unused)) gpointer data)
{
- gtk_main_quit();
+ gfio_quit(data);
}
static void *job_thread(void *arg)
return ge;
}
-/*
- * FIXME: need more handling here
- */
-static void ge_destroy(GtkWidget *w, gpointer data)
-{
- struct gui_entry *ge = data;
- struct gfio_client *gc = ge->client;
-
- if (gc && gc->client) {
- if (ge->state >= GE_STATE_CONNECTED)
- fio_client_terminate(gc->client);
-
- fio_put_client(gc->client);
- }
-
- flist_del(&ge->list);
- free(ge);
-}
-
static struct gui_entry *get_new_ge_with_tab(const char *name)
{
struct gui_entry *ge;
ge = alloc_new_gui_entry(&main_ui);
ge->vbox = new_client_page(ge);
- g_signal_connect(ge->vbox, "destroy", G_CALLBACK(ge_destroy), ge);
+ g_signal_connect(ge->vbox, "destroy", G_CALLBACK(ge_widget_destroy), ge);
ge->page_label = gtk_label_new(name);
ge->page_num = gtk_notebook_append_page(GTK_NOTEBOOK(main_ui.notebook), ge->vbox, ge->page_label);
return;
}
- gtk_main_quit();
+ gfio_quit(ui);
}
static void file_add_recent(struct gui *ui, const gchar *uri)