#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;
ts->groupid = -1;
}
-void show_run_stats(void)
+static void __show_run_stats(void)
{
struct group_run_stats *runstats, *rs;
struct thread_data *td;
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;
td->update_rusage = 0;
}
- show_run_stats();
+ __show_run_stats();
for_each_td(td, i) {
if (td_read(td) && td->io_bytes[DDIR_READ])
}
free(rt);
+ fio_mutex_up(stat_mutex);
return NULL;
}
{
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;
+static struct timeval status_time;
+
+#define FIO_STATUS_FILE "/tmp/fio-dump-status"
+
+static int check_status_file(void)
+{
+ struct stat sb;
+ const char *temp_dir;
+ char fio_status_file_path[PATH_MAX];
+
+ 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_path);
+ return 1;
+}
+
+void check_for_running_stats(void)
+{
+ if (status_interval) {
+ if (!status_interval_init) {
+ fio_gettime(&status_time, NULL);
+ status_interval_init = 1;
+ } else if (mtime_since_now(&status_time) >= status_interval) {
+ show_running_run_stats();
+ fio_gettime(&status_time, NULL);
+ return;
+ }
+ }
+ if (check_status_file()) {
+ show_running_run_stats();
+ return;
+ }
}
static inline void add_stat_sample(struct io_stat *is, unsigned long data)
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);
+}