Add runstate swap helpers
[fio.git] / libfio.c
index 433fee4671559e0f1e4a5ad200770f0166c166fc..8eddab80b345651f11533038963bb03e5bc0ff93 100644 (file)
--- a/libfio.c
+++ b/libfio.c
 #include <string.h>
 #include <sys/types.h>
 #include <signal.h>
+#include <stdint.h>
+#include <locale.h>
+
 #include "fio.h"
+#include "smalloc.h"
+#include "os/os.h"
 
 /*
  * Just expose an empty list, if the OS does not support disk util stats
@@ -36,6 +41,9 @@ FLIST_HEAD(disk_list);
 
 unsigned long arch_flags = 0;
 
+uintptr_t page_mask = 0;
+uintptr_t page_size = 0;
+
 static const char *fio_os_strings[os_nr] = {
        "Invalid",
        "Linux",
@@ -44,8 +52,10 @@ static const char *fio_os_strings[os_nr] = {
        "HP-UX",
        "OSX",
        "NetBSD",
+       "OpenBSD",
        "Solaris",
-       "Windows"
+       "Windows",
+       "Android",
 };
 
 static const char *fio_arch_strings[arch_nr] = {
@@ -75,7 +85,6 @@ static void reset_io_counters(struct thread_data *td)
                td->this_io_blocks[ddir] = 0;
                td->rate_bytes[ddir] = 0;
                td->rate_blocks[ddir] = 0;
-               td->io_issues[ddir] = 0;
        }
        td->zone_bytes = 0;
 
@@ -125,6 +134,8 @@ void reset_all_stats(struct thread_data *td)
        fio_gettime(&tv, NULL);
        memcpy(&td->epoch, &tv, sizeof(tv));
        memcpy(&td->start, &tv, sizeof(tv));
+
+       lat_target_reset(td);
 }
 
 void reset_fio_state(void)
@@ -132,8 +143,6 @@ void reset_fio_state(void)
        groupid = 0;
        thread_number = 0;
        stat_number = 0;
-       nr_process = 0;
-       nr_thread = 0;
        done_secs = 0;
 }
 
@@ -163,6 +172,19 @@ void td_set_runstate(struct thread_data *td, int runstate)
        td->runstate = runstate;
 }
 
+int td_bump_runstate(struct thread_data *td, int new_state)
+{
+       int old_state = td->runstate;
+
+       td_set_runstate(td, new_state);
+       return old_state;
+}
+
+void td_restore_runstate(struct thread_data *td, int old_state)
+{
+       td_set_runstate(td, old_state);
+}
+
 void fio_terminate_threads(int group_id)
 {
        struct thread_data *td;
@@ -195,4 +217,70 @@ void fio_terminate_threads(int group_id)
        }
 }
 
+static int endian_check(void)
+{
+       union {
+               uint8_t c[8];
+               uint64_t v;
+       } u;
+       int le = 0, be = 0;
+
+       u.v = 0x12;
+       if (u.c[7] == 0x12)
+               be = 1;
+       else if (u.c[0] == 0x12)
+               le = 1;
+
+#if defined(CONFIG_LITTLE_ENDIAN)
+       if (be)
+               return 1;
+#elif defined(CONFIG_BIG_ENDIAN)
+       if (le)
+               return 1;
+#else
+       return 1;
+#endif
+
+       if (!le && !be)
+               return 1;
+
+       return 0;
+}
+
+int initialize_fio(char *envp[])
+{
+       long ps;
+
+       if (endian_check()) {
+               log_err("fio: endianness settings appear wrong.\n");
+               log_err("fio: please report this to fio@vger.kernel.org\n");
+               return 1;
+       }
+
+#if !defined(CONFIG_GETTIMEOFDAY) && !defined(CONFIG_CLOCK_GETTIME)
+#error "No available clock source!"
+#endif
+
+       arch_init(envp);
 
+       sinit();
+
+       /*
+        * We need locale for number printing, if it isn't set then just
+        * go with the US format.
+        */
+       if (!getenv("LC_NUMERIC"))
+               setlocale(LC_NUMERIC, "en_US");
+
+       ps = sysconf(_SC_PAGESIZE);
+       if (ps < 0) {
+               log_err("Failed to get page size\n");
+               return 1;
+       }
+
+       page_size = ps;
+       page_mask = ps - 1;
+
+       fio_keywords_init();
+       return 0;
+}