X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=332ccd0f55c3072e1d9732546e055e1ecbed5f0e;hp=03a45fc70a197562cc09c2a21d1fbf9f645c3867;hb=72fe3ef10c1911b6f9ec84af99ba6f97112e216b;hpb=fdd5f15f8231e8c91c4deff22e630a34addd0fef diff --git a/stat.c b/stat.c index 03a45fc7..332ccd0f 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; @@ -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; @@ -1359,6 +1361,13 @@ void show_run_stats(void) 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; @@ -1393,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]) @@ -1405,6 +1414,7 @@ static void *__show_running_run_stats(void fio_unused *arg) } free(rt); + fio_mutex_up(stat_mutex); return NULL; } @@ -1417,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; @@ -1429,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; } @@ -1701,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); +}