X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=stat.c;h=442caa0cd1973400d5323a7202b6350155a6ae1d;hb=b68e5f80e8804a689ad438a17d8e87fe5089cee1;hp=7ff7ad4d8ce42fd504e394d358c7d996102ce665;hpb=06464907159baf7a1eeac654a023743e33f28d86;p=fio.git diff --git a/stat.c b/stat.c index 7ff7ad4d..442caa0c 100644 --- 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; @@ -241,15 +243,13 @@ out: int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, double *mean, double *dev) { - double n = is->samples; + double n = (double) is->samples; - if (is->samples == 0) + if (n == 0) return 0; *min = is->min_val; *max = is->max_val; - - n = (double) is->samples; *mean = is->mean.u.f; if (n > 1.0) @@ -1141,7 +1141,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 +1354,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 +1400,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 +1412,7 @@ static void *__show_running_run_stats(void fio_unused *arg) } free(rt); + fio_mutex_up(stat_mutex); return NULL; } @@ -1416,8 +1425,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 +1443,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 +1725,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); +}