Update GUI to attempt to graphically handle ETA output

The whole layout will probably be changed, but for now it
demonstrates how to properly integrate with the net client
to handle the data and output it.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index faa990b..842f225 100644
--- a/client.c
+++ b/client.c
@@ -21,13 +21,6 @@
 #include "flist.h"
 #include "hash.h"
 
-extern void (*update_thread_status)(char *status_message, double perc);
-
-struct client_eta {
-	struct jobs_eta eta;
-	unsigned int pending;
-};
-
 static void fio_client_text_op(struct fio_client *client,
 		FILE *f, __u16 pdu_len, const char *buf)
 {
@@ -56,7 +49,6 @@
 	.group_stats	= handle_gs,
 	.eta		= handle_eta,
 	.probe		= handle_probe,
-	/* status display, if NULL, printf is used */
 };
 
 static struct timeval eta_tv;
@@ -85,9 +77,6 @@
 #define FIO_CLIENT_HASH_MASK	(FIO_CLIENT_HASH_SZ - 1)
 static struct flist_head client_hash[FIO_CLIENT_HASH_SZ];
 
-static int handle_client(struct fio_client *client, struct client_ops *ops);
-static void dec_jobs_eta(struct client_eta *eta);
-
 static void fio_client_add_hash(struct fio_client *client)
 {
 	int bucket = hash_long(client->fd, FIO_CLIENT_HASH_BITS);
@@ -135,7 +124,7 @@
 
 	if (!flist_empty(&client->eta_list)) {
 		flist_del_init(&client->eta_list);
-		dec_jobs_eta(client->eta_in_flight);
+		fio_client_dec_jobs_eta(client->eta_in_flight, display_thread_status);
 	}
 
 	free(client->hostname);
@@ -681,7 +670,7 @@
 	print_disk_util(&du->dus, &du->agg, terse_output);
 }
 
-static void convert_jobs_eta(struct jobs_eta *je)
+void fio_client_convert_jobs_eta(struct jobs_eta *je)
 {
 	int i;
 
@@ -689,12 +678,12 @@
 	je->nr_ramp		= le32_to_cpu(je->nr_ramp);
 	je->nr_pending		= le32_to_cpu(je->nr_pending);
 	je->files_open		= le32_to_cpu(je->files_open);
-	je->m_rate		= le32_to_cpu(je->m_rate);
-	je->t_rate		= le32_to_cpu(je->t_rate);
-	je->m_iops		= le32_to_cpu(je->m_iops);
-	je->t_iops		= le32_to_cpu(je->t_iops);
 
 	for (i = 0; i < 2; i++) {
+		je->m_rate[i]		= le32_to_cpu(je->m_rate[i]);
+		je->t_rate[i]		= le32_to_cpu(je->t_rate[i]);
+		je->m_iops[i]		= le32_to_cpu(je->m_iops[i]);
+		je->t_iops[i]		= le32_to_cpu(je->t_iops[i]);
 		je->rate[i]	= le32_to_cpu(je->rate[i]);
 		je->iops[i]	= le32_to_cpu(je->iops[i]);
 	}
@@ -703,7 +692,7 @@
 	je->eta_sec		= le64_to_cpu(je->eta_sec);
 }
 
-static void sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
+void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
 {
 	int i;
 
@@ -711,12 +700,12 @@
 	dst->nr_ramp		+= je->nr_ramp;
 	dst->nr_pending		+= je->nr_pending;
 	dst->files_open		+= je->files_open;
-	dst->m_rate		+= je->m_rate;
-	dst->t_rate		+= je->t_rate;
-	dst->m_iops		+= je->m_iops;
-	dst->t_iops		+= je->t_iops;
 
 	for (i = 0; i < 2; i++) {
+		dst->m_rate[i]	+= je->m_rate[i];
+		dst->t_rate[i]	+= je->t_rate[i];
+		dst->m_iops[i]	+= je->m_iops[i];
+		dst->t_iops[i]	+= je->t_iops[i];
 		dst->rate[i]	+= je->rate[i];
 		dst->iops[i]	+= je->iops[i];
 	}
@@ -727,10 +716,10 @@
 		dst->eta_sec = je->eta_sec;
 }
 
-static void dec_jobs_eta(struct client_eta *eta)
+void fio_client_dec_jobs_eta(struct client_eta *eta, void (*fn)(struct jobs_eta *))
 {
 	if (!--eta->pending) {
-		display_thread_status(&eta->eta);
+		fn(&eta->eta);
 		free(eta);
 	}
 }
@@ -771,9 +760,9 @@
 	client->eta_in_flight = NULL;
 	flist_del_init(&client->eta_list);
 
-	convert_jobs_eta(je);
-	sum_jobs_eta(&eta->eta, je);
-	dec_jobs_eta(eta);
+	fio_client_convert_jobs_eta(je);
+	fio_client_sum_jobs_eta(&eta->eta, je);
+	fio_client_dec_jobs_eta(eta, display_thread_status);
 }
 
 static void handle_probe(struct fio_client *client, struct fio_net_cmd *cmd)
@@ -819,7 +808,7 @@
 		log_info("client <%s>: exited with error %d\n", client->hostname, client->error);
 }
 
-static int handle_client(struct fio_client *client, struct client_ops *ops)
+int fio_handle_client(struct fio_client *client, struct client_ops *ops)
 {
 	struct fio_net_cmd *cmd;
 
@@ -917,7 +906,7 @@
 	}
 
 	while (skipped--)
-		dec_jobs_eta(eta);
+		fio_client_dec_jobs_eta(eta, display_thread_status);
 
 	dprint(FD_NET, "client: requested eta tag %p\n", eta);
 }
@@ -984,9 +973,6 @@
 	init_thread_stat(&client_ts);
 	init_group_run_stat(&client_gs);
 
-	/* Used by eta.c:display_thread_status() */
-	update_thread_status = ops->thread_status_display;
-
 	while (!exit_backend && nr_clients) {
 		struct flist_head *entry, *tmp;
 		struct fio_client *client;
@@ -1042,7 +1028,7 @@
 				log_err("fio: unknown client fd %d\n", pfds[i].fd);
 				continue;
 			}
-			if (!handle_client(client, ops)) {
+			if (!fio_handle_client(client, ops)) {
 				log_info("client: host=%s disconnected\n",
 						client->hostname);
 				remove_client(client);