Option for changing log files to use Unix epoch instead of being
[fio.git] / libfio.c
index ed26114d452fe4488a238ac04a7c4fd6da9e5624..d88ed4ed2032ecccfad5435b0de10abc42157973 100644 (file)
--- a/libfio.c
+++ b/libfio.c
@@ -33,6 +33,7 @@
 #include "smalloc.h"
 #include "os/os.h"
 #include "filelock.h"
+#include "helper_thread.h"
 
 /*
  * Just expose an empty list, if the OS does not support disk util stats
@@ -46,6 +47,7 @@ unsigned long arch_flags = 0;
 uintptr_t page_mask = 0;
 uintptr_t page_size = 0;
 
+/* see os/os.h */
 static const char *fio_os_strings[os_nr] = {
        "Invalid",
        "Linux",
@@ -61,6 +63,7 @@ static const char *fio_os_strings[os_nr] = {
        "DragonFly",
 };
 
+/* see arch/arch.h */
 static const char *fio_arch_strings[arch_nr] = {
        "Invalid",
        "x86-64",
@@ -74,22 +77,29 @@ static const char *fio_arch_strings[arch_nr] = {
        "arm",
        "sh",
        "hppa",
+       "mips",
+       "aarch64",
        "generic"
 };
 
-static void reset_io_counters(struct thread_data *td)
+static void reset_io_counters(struct thread_data *td, int all)
 {
        int ddir;
 
-       for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
-               td->stat_io_bytes[ddir] = 0;
-               td->this_io_bytes[ddir] = 0;
-               td->stat_io_blocks[ddir] = 0;
-               td->this_io_blocks[ddir] = 0;
-               td->rate_bytes[ddir] = 0;
-               td->rate_blocks[ddir] = 0;
-               td->bytes_done[ddir] = 0;
+       if (all) {
+               for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
+                       td->stat_io_bytes[ddir] = 0;
+                       td->this_io_bytes[ddir] = 0;
+                       td->stat_io_blocks[ddir] = 0;
+                       td->this_io_blocks[ddir] = 0;
+                       td->rate_bytes[ddir] = 0;
+                       td->rate_blocks[ddir] = 0;
+                       td->bytes_done[ddir] = 0;
+                       td->rate_io_issue_bytes[ddir] = 0;
+                       td->rate_next_io_time[ddir] = 0;
+               }
        }
+
        td->zone_bytes = 0;
 
        td->last_was_sync = 0;
@@ -102,12 +112,12 @@ static void reset_io_counters(struct thread_data *td)
                td->nr_done_files = 0;
 }
 
-void clear_io_state(struct thread_data *td)
+void clear_io_state(struct thread_data *td, int all)
 {
        struct fio_file *f;
        unsigned int i;
 
-       reset_io_counters(td);
+       reset_io_counters(td, all);
 
        close_files(td);
        for_each_file(td, f, i) {
@@ -116,17 +126,17 @@ void clear_io_state(struct thread_data *td)
        }
 
        /*
-        * Set the same seed to get repeatable runs
+        * Re-Seed random number generator if rand_repeatable is true
         */
-       td_fill_rand_seeds(td);
+       if (td->o.rand_repeatable)
+               td_fill_rand_seeds(td);
 }
 
 void reset_all_stats(struct thread_data *td)
 {
-       struct timeval tv;
        int i;
 
-       reset_io_counters(td);
+       reset_io_counters(td, 1);
 
        for (i = 0; i < DDIR_RWDIR_CNT; i++) {
                td->io_bytes[i] = 0;
@@ -137,11 +147,14 @@ void reset_all_stats(struct thread_data *td)
                td->rwmix_issues = 0;
        }
 
-       fio_gettime(&tv, NULL);
-       memcpy(&td->epoch, &tv, sizeof(tv));
-       memcpy(&td->start, &tv, sizeof(tv));
+       set_epoch_time(td, td->o.log_unix_epoch);
+       memcpy(&td->start, &td->epoch, sizeof(struct timeval));
+       memcpy(&td->iops_sample_time, &td->epoch, sizeof(struct timeval));
+       memcpy(&td->bw_sample_time, &td->epoch, sizeof(struct timeval));
 
        lat_target_reset(td);
+       clear_rusage_stat(td);
+       helper_reset();
 }
 
 void reset_fio_state(void)
@@ -168,13 +181,38 @@ const char *fio_get_arch_string(int nr)
        return NULL;
 }
 
+static const char *td_runstates[] = {
+       "NOT_CREATED",
+       "CREATED",
+       "INITIALIZED",
+       "RAMP",
+       "SETTING_UP",
+       "RUNNING",
+       "PRE_READING",
+       "VERIFYING",
+       "FSYNCING",
+       "FINISHING",
+       "EXITED",
+       "REAPED",
+};
+
+const char *runstate_to_name(int runstate)
+{
+       compiletime_assert(TD_LAST == 12, "td runstate list");
+       if (runstate >= 0 && runstate < TD_LAST)
+               return td_runstates[runstate];
+
+       return "invalid";
+}
+
 void td_set_runstate(struct thread_data *td, int runstate)
 {
        if (td->runstate == runstate)
                return;
 
-       dprint(FD_PROCESS, "pid=%d: runstate %d -> %d\n", (int) td->pid,
-                                               td->runstate, runstate);
+       dprint(FD_PROCESS, "pid=%d: runstate %s -> %s\n", (int) td->pid,
+                                               runstate_to_name(td->runstate),
+                                               runstate_to_name(runstate));
        td->runstate = runstate;
 }
 
@@ -198,7 +236,7 @@ void fio_mark_td_terminate(struct thread_data *td)
        td->terminate = 1;
 }
 
-void fio_terminate_threads(int group_id)
+void fio_terminate_threads(unsigned int group_id)
 {
        struct thread_data *td;
        pid_t pid = getpid();
@@ -207,7 +245,7 @@ void fio_terminate_threads(int group_id)
        dprint(FD_PROCESS, "terminate group_id=%d\n", group_id);
 
        for_each_td(td, i) {
-               if (group_id == TERMINATE_ALL || groupid == td->groupid) {
+               if (group_id == TERMINATE_ALL || group_id == td->groupid) {
                        dprint(FD_PROCESS, "setting terminate on %s/%d\n",
                                                td->o.name, (int) td->pid);
 
@@ -238,14 +276,18 @@ int fio_running_or_pending_io_threads(void)
 {
        struct thread_data *td;
        int i;
+       int nr_io_threads = 0;
 
        for_each_td(td, i) {
                if (td->flags & TD_F_NOIO)
                        continue;
+               nr_io_threads++;
                if (td->runstate < TD_EXITED)
                        return 1;
        }
 
+       if (!nr_io_threads)
+               return -1; /* we only had cpuio threads to begin with */
        return 0;
 }
 
@@ -353,3 +395,8 @@ int initialize_fio(char *envp[])
        fio_keywords_init();
        return 0;
 }
+
+void deinitialize_fio(void)
+{
+       fio_keywords_exit();
+}