genfio: Splitting gen_template in 2 parts
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 7ff7ad4d8ce42fd504e394d358c7d996102ce665..332ccd0f55c3072e1d9732546e055e1ecbed5f0e 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -14,6 +14,8 @@
 #include "lib/getrusage.h"
 #include "idletime.h"
 
+static struct fio_mutex *stat_mutex;
+
 void update_rusage_stat(struct thread_data *td)
 {
        struct thread_stat *ts = &td->ts;
@@ -1141,7 +1143,7 @@ void init_thread_stat(struct thread_stat *ts)
        ts->groupid = -1;
 }
 
-void show_run_stats(void)
+static void __show_run_stats(void)
 {
        struct group_run_stats *runstats, *rs;
        struct thread_data *td;
@@ -1354,10 +1356,18 @@ void show_run_stats(void)
                show_idle_prof_stats(FIO_OUTPUT_NORMAL, NULL);
        }
 
+       log_info_flush();
        free(runstats);
        free(threadstats);
 }
 
+void show_run_stats(void)
+{
+       fio_mutex_down(stat_mutex);
+       __show_run_stats();
+       fio_mutex_up(stat_mutex);
+}
+
 static void *__show_running_run_stats(void fio_unused *arg)
 {
        struct thread_data *td;
@@ -1392,7 +1402,7 @@ static void *__show_running_run_stats(void fio_unused *arg)
                td->update_rusage = 0;
        }
 
-       show_run_stats();
+       __show_run_stats();
 
        for_each_td(td, i) {
                if (td_read(td) && td->io_bytes[DDIR_READ])
@@ -1404,6 +1414,7 @@ static void *__show_running_run_stats(void fio_unused *arg)
        }
 
        free(rt);
+       fio_mutex_up(stat_mutex);
        return NULL;
 }
 
@@ -1416,8 +1427,14 @@ void show_running_run_stats(void)
 {
        pthread_t thread;
 
-       pthread_create(&thread, NULL, __show_running_run_stats, NULL);
-       pthread_detach(thread);
+       fio_mutex_down(stat_mutex);
+
+       if (!pthread_create(&thread, NULL, __show_running_run_stats, NULL)) {
+               pthread_detach(thread);
+               return;
+       }
+
+       fio_mutex_up(stat_mutex);
 }
 
 static int status_interval_init;
@@ -1428,11 +1445,21 @@ static struct timeval status_time;
 static int check_status_file(void)
 {
        struct stat sb;
+       const char *temp_dir;
+       char fio_status_file_path[PATH_MAX];
 
-       if (stat(FIO_STATUS_FILE, &sb))
+       temp_dir = getenv("TMPDIR");
+       if (temp_dir == NULL)
+               temp_dir = getenv("TEMP");
+       if (temp_dir == NULL)
+               temp_dir = "/tmp";
+
+       snprintf(fio_status_file_path, sizeof(fio_status_file_path), "%s/%s", temp_dir, FIO_STATUS_FILE);
+
+       if (stat(fio_status_file_path, &sb))
                return 0;
 
-       unlink(FIO_STATUS_FILE);
+       unlink(fio_status_file_path);
        return 1;
 }
 
@@ -1700,3 +1727,18 @@ void add_iops_sample(struct thread_data *td, enum fio_ddir ddir,
 
        fio_gettime(&td->iops_sample_time, NULL);
 }
+
+void stat_init(void)
+{
+       stat_mutex = fio_mutex_init(FIO_MUTEX_UNLOCKED);
+}
+
+void stat_exit(void)
+{
+       /*
+        * When we have the mutex, we know out-of-band access to it
+        * have ended.
+        */
+       fio_mutex_down(stat_mutex);
+       fio_mutex_remove(stat_mutex);
+}