Cleanup the parallellized log writing

And move it all to iolog.c, this means we can un-export
some of the log functions, too.

Signed-off-by: Jens Axboe <axboe@fb.com>
diff --git a/iolog.c b/iolog.c
index 8589df6..1af31cb 100644
--- a/iolog.c
+++ b/iolog.c
@@ -539,8 +539,9 @@
 	free(log);
 }
 
-int finish_log_named(struct thread_data *td, struct io_log *log,
-		     const char *prefix, const char *postfix, int trylock)
+static int finish_log_named(struct thread_data *td, struct io_log *log,
+			    const char *prefix, const char *postfix,
+			    int trylock)
 {
 	char file_name[256];
 
@@ -563,8 +564,131 @@
 	return 0;
 }
 
-int finish_log(struct thread_data *td, struct io_log *log, const char *name,
-	       int trylock)
+static int finish_log(struct thread_data *td, struct io_log *log,
+		      const char *name, int trylock)
 {
 	return finish_log_named(td, log, td->o.name, name, trylock);
 }
+
+static int write_this_log(struct thread_data *td, struct io_log *log,
+			  const char *log_file, const char *name, int try)
+{
+	int ret;
+
+	if (!log)
+		return 0;
+
+	if (log_file)
+		ret = finish_log_named(td, log, log_file, name, try);
+	else
+		ret = finish_log(td, log, name, try);
+
+	return ret;
+}
+
+static int write_iops_log(struct thread_data *td, int try)
+{
+	struct thread_options *o = &td->o;
+
+	return write_this_log(td, td->iops_log, o->iops_log_file, "iops", try);
+}
+
+static int write_slat_log(struct thread_data *td, int try)
+{
+	struct thread_options *o = &td->o;
+
+	return write_this_log(td, td->slat_log, o->lat_log_file, "slat", try);
+}
+
+static int write_clat_log(struct thread_data *td, int try)
+{
+	struct thread_options *o = &td->o;
+
+	return write_this_log(td, td->clat_log, o->lat_log_file, "clat" , try);
+}
+
+static int write_lat_log(struct thread_data *td, int try)
+{
+	struct thread_options *o = &td->o;
+
+	return write_this_log(td, td->lat_log, o->lat_log_file, "lat", try);
+}
+
+static int write_bandw_log(struct thread_data *td, int try)
+{
+	struct thread_options *o = &td->o;
+
+	return write_this_log(td, td->bw_log, o->bw_log_file, "bw", try);
+}
+
+enum {
+	BW_LOG_MASK	= 1,
+	LAT_LOG_MASK	= 2,
+	SLAT_LOG_MASK	= 4,
+	CLAT_LOG_MASK	= 8,
+	IOPS_LOG_MASK	= 16,
+
+	ALL_LOG_MASK	= 31,
+	ALL_LOG_NR	= 5,
+};
+
+struct log_type {
+	unsigned int mask;
+	int (*fn)(struct thread_data *, int);
+};
+
+static struct log_type log_types[] = {
+	{
+		.mask	= BW_LOG_MASK,
+		.fn	= write_bandw_log,
+	},
+	{
+		.mask	= LAT_LOG_MASK,
+		.fn	= write_lat_log,
+	},
+	{
+		.mask	= SLAT_LOG_MASK,
+		.fn	= write_slat_log,
+	},
+	{
+		.mask	= CLAT_LOG_MASK,
+		.fn	= write_clat_log,
+	},
+	{
+		.mask	= IOPS_LOG_MASK,
+		.fn	= write_iops_log,
+	},
+};
+
+void fio_writeout_logs(struct thread_data *td)
+{
+	unsigned int log_mask = ALL_LOG_MASK;
+	unsigned int log_left = ALL_LOG_NR;
+	int old_state, i;
+
+	old_state = td_bump_runstate(td, TD_FINISHING);
+
+	finalize_logs(td);
+
+	while (log_left) {
+		int prev_log_left = log_left;
+
+		for (i = 0; i < ALL_LOG_NR && log_left; i++) {
+			struct log_type *lt = &log_types[i];
+			int ret;
+
+			if (log_mask & lt->mask) {
+				ret = lt->fn(td, log_left != 1);
+				if (!ret) {
+					log_left--;
+					log_mask &= ~lt->mask;
+				}
+			}
+		}
+
+		if (prev_log_left == log_left)
+			usleep(5000);
+	}
+
+	td_restore_runstate(td, old_state);
+}