fio: Fix padding properly
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 536d5a9c000449675caa36f8a4d998b79f58bb82..84d9eefd842e76ca6a1d96a482ad3fd2a4c251a7 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -506,9 +506,7 @@ static void show_thread_status_normal(struct thread_stat *ts,
        time_t time_p;
        char time_buf[64];
 
-       if (!(ts->io_bytes[DDIR_READ] + ts->io_bytes[DDIR_WRITE] +
-           ts->io_bytes[DDIR_TRIM]) && !(ts->total_io_u[DDIR_READ] +
-           ts->total_io_u[DDIR_WRITE] + ts->total_io_u[DDIR_TRIM]))
+       if (!ddir_rw_sum(ts->io_bytes) && !ddir_rw_sum(ts->total_io_u))
                return;
 
        time(&time_p);
@@ -707,6 +705,9 @@ static void add_ddir_status_json(struct thread_stat *ts,
        json_object_add_value_int(dir_object, "bw", bw);
        json_object_add_value_int(dir_object, "iops", iops);
        json_object_add_value_int(dir_object, "runtime", ts->runtime[ddir]);
+       json_object_add_value_int(dir_object, "total_ios", ts->total_io_u[ddir]);
+       json_object_add_value_int(dir_object, "short_ios", ts->short_io_u[ddir]);
+       json_object_add_value_int(dir_object, "drop_ios", ts->drop_io_u[ddir]);
 
        if (!calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) {
                min = max = 0;
@@ -1076,6 +1077,10 @@ void sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src)
                dst->agg[i] += src->agg[i];
        }
 
+       if (!dst->kb_base)
+               dst->kb_base = src->kb_base;
+       if (!dst->unit_base)
+               dst->unit_base = src->unit_base;
 }
 
 void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
@@ -1417,7 +1422,7 @@ void show_run_stats(void)
        fio_mutex_up(stat_mutex);
 }
 
-static void *__show_running_run_stats(void *arg)
+void __show_running_run_stats(void)
 {
        struct thread_data *td;
        unsigned long long *rt;
@@ -1446,6 +1451,8 @@ static void *__show_running_run_stats(void *arg)
        }
 
        for_each_td(td, i) {
+               if (td->runstate >= TD_EXITED)
+                       continue;
                if (td->rusage_sem) {
                        td->update_rusage = 1;
                        fio_mutex_down(td->rusage_sem);
@@ -1466,34 +1473,6 @@ static void *__show_running_run_stats(void *arg)
 
        free(rt);
        fio_mutex_up(stat_mutex);
-       free(arg);
-       return NULL;
-}
-
-/*
- * Called from signal handler. It _should_ be safe to just run this inline
- * in the sig handler, but we should be disturbing the system less by just
- * creating a thread to do it.
- */
-void show_running_run_stats(void)
-{
-       pthread_t *thread;
-
-       thread = calloc(1, sizeof(*thread));
-       if (!thread)
-               return;
-
-       if (!pthread_create(thread, NULL, __show_running_run_stats, thread)) {
-               int err;
-
-               err = pthread_detach(*thread);
-               if (err)
-                       log_err("fio: DU thread detach failed: %s\n", strerror(err));
-
-               return;
-       }
-
-       free(thread);
 }
 
 static int status_interval_init;
@@ -1912,3 +1891,12 @@ void stat_exit(void)
        fio_mutex_down(stat_mutex);
        fio_mutex_remove(stat_mutex);
 }
+
+/*
+ * Called from signal handler. Wake up status thread.
+ */
+void show_running_run_stats(void)
+{
+       helper_do_stat = 1;
+       pthread_cond_signal(&helper_cond);
+}