mutex: make 0/1 FIO_MUTEX_LOCKED and FIO_MUTEX_UNLOCKED
[fio.git] / init.c
diff --git a/init.c b/init.c
index 4a3716bfeb5c058c235e9e529e73c4addef210b2..475a6ad29f69a87da2463f4e020609c5e99861b5 100644 (file)
--- a/init.c
+++ b/init.c
 
 #include "lib/getopt.h"
 
-#include "fio_version.h"
-
-#if FIO_PATCH > 0
-const char fio_version_string[] =      __fio_stringify(FIO_MAJOR) "."  \
-                                       __fio_stringify(FIO_MINOR) "."  \
-                                       __fio_stringify(FIO_PATCH);
-#else
-const char fio_version_string[] =      __fio_stringify(FIO_MAJOR) "."  \
-                                       __fio_stringify(FIO_MINOR);
-#endif
+const char fio_version_string[] = FIO_VERSION;
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -74,21 +65,23 @@ static char cmd_optstr[256];
 static int did_arg;
 
 const fio_fp64_t def_percentile_list[FIO_IO_U_LIST_MAX_LEN] = {
-       { .u.f  =  1.0 },
-       { .u.f  =  5.0 },
-       { .u.f  = 10.0 },
-       { .u.f  = 20.0 },
-       { .u.f  = 30.0 },
-       { .u.f  = 40.0 },
-       { .u.f  = 50.0 },
-       { .u.f  = 60.0 },
-       { .u.f  = 70.0 },
-       { .u.f  = 80.0 },
-       { .u.f  = 90.0 },
-       { .u.f  = 95.0 },
-       { .u.f  = 99.0 },
-       { .u.f  = 99.5 },
-       { .u.f  = 99.9 },
+       { .u.f  =  1.00 },
+       { .u.f  =  5.00 },
+       { .u.f  = 10.00 },
+       { .u.f  = 20.00 },
+       { .u.f  = 30.00 },
+       { .u.f  = 40.00 },
+       { .u.f  = 50.00 },
+       { .u.f  = 60.00 },
+       { .u.f  = 70.00 },
+       { .u.f  = 80.00 },
+       { .u.f  = 90.00 },
+       { .u.f  = 95.00 },
+       { .u.f  = 99.00 },
+       { .u.f  = 99.50 },
+       { .u.f  = 99.90 },
+       { .u.f  = 99.95 },
+       { .u.f  = 99.99 },
 };
 
 #define FIO_CLIENT_FLAG                (1 << 16)
@@ -221,6 +214,7 @@ static void free_shm(void)
 
                threads = NULL;
                file_hash_exit();
+               flow_exit();
                fio_debug_jobp = NULL;
                shmdt(tp);
                shmctl(shm_id, IPC_RMID, &sbuf);
@@ -255,7 +249,7 @@ static int setup_thread_area(void)
                shm_id = shmget(0, size, IPC_CREAT | 0600);
                if (shm_id != -1)
                        break;
-               if (errno != EINVAL) {
+               if (errno != EINVAL && errno != ENOMEM) {
                        perror("shmget");
                        break;
                }
@@ -277,6 +271,9 @@ static int setup_thread_area(void)
        fio_debug_jobp = (void *) hash + file_hash_size;
        *fio_debug_jobp = -1;
        file_hash_init(hash);
+
+       flow_init();
+
        return 0;
 }
 
@@ -324,6 +321,7 @@ static void put_job(struct thread_data *td)
                return;
 
        profile_td_exit(td);
+       flow_exit_job(td);
 
        if (td->error)
                log_info("fio: %s\n", td->verror);
@@ -550,6 +548,28 @@ static int fixup_options(struct thread_data *td)
        }
 #endif
 
+#ifdef WIN32
+       /*
+        * Windows doesn't support O_DIRECT or O_SYNC with the _open interface,
+        * so fail if we're passed those flags
+        */
+       if ((td->io_ops->flags & FIO_SYNCIO) && (td->o.odirect || td->o.sync_io)) {
+               log_err("fio: Windows does not support direct or non-buffered io with"
+                               " the synchronous ioengines. Use the 'windowsaio' ioengine"
+                               " with 'direct=1' and 'iodepth=1' instead.\n");
+               ret = 1;
+       }
+#endif
+
+       /*
+        * For fully compressible data, just zero them at init time.
+        * It's faster than repeatedly filling it.
+        */
+       if (td->o.compress_percentage == 100) {
+               td->o.zero_buffers = 1;
+               td->o.compress_percentage = 0;
+       }
+
        return ret;
 }
 
@@ -655,31 +675,6 @@ void td_fill_rand_seeds(struct thread_data *td)
        init_rand_seed(&td->buf_state, td->rand_seeds[7]);
 }
 
-/*
- * Initialize the various random states we need (random io, block size ranges,
- * read/write mix, etc).
- */
-static int init_random_state(struct thread_data *td)
-{
-       int fd;
-
-       fd = open("/dev/urandom", O_RDONLY);
-       if (fd == -1) {
-               td_verror(td, errno, "open");
-               return 1;
-       }
-
-       if (read(fd, td->rand_seeds, sizeof(td->rand_seeds)) <
-           (int) sizeof(td->rand_seeds)) {
-               td_verror(td, EIO, "read");
-               close(fd);
-               return 1;
-       }
-
-       close(fd);
-       td_fill_rand_seeds(td);
-       return 0;
-}
 
 /*
  * Initializes the ioengine configured for a job, if it has not been done so
@@ -796,6 +791,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        if (fixup_options(td))
                goto err;
 
+       flow_init_job(td);
+
        /*
         * IO engines only need this for option callbacks, and the address may
         * change in subprocesses.
@@ -810,7 +807,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
                        f->real_file_size = -1ULL;
        }
 
-       td->mutex = fio_mutex_init(0);
+       td->mutex = fio_mutex_init(FIO_MUTEX_LOCKED);
 
        td->ts.clat_percentiles = td->o.clat_percentiles;
        if (td->o.overwrite_plist)
@@ -832,8 +829,10 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        td->groupid = groupid;
        prev_group_jobs++;
 
-       if (init_random_state(td))
+       if (init_random_state(td, td->rand_seeds, sizeof(td->rand_seeds))) {
+               td_verror(td, errno, "init_random_state");
                goto err;
+       }
 
        if (setup_rate(td))
                goto err;
@@ -1180,7 +1179,7 @@ static int fill_def_thread(void)
 
 static void usage(const char *name)
 {
-       printf("fio %s\n", fio_version_string);
+       printf("%s\n", fio_version_string);
        printf("%s [options] [job options] <job file(s)>\n", name);
        printf("  --debug=options\tEnable debug logging. May be one/more of:\n"
                "\t\t\tprocess,file,io,mem,blktrace,verify,random,parse,\n"
@@ -1411,7 +1410,7 @@ int parse_cmd_line(int argc, char *argv[])
                        break;
                case 'v':
                        if (!cur_client) {
-                               log_info("fio %s\n", fio_version_string);
+                               log_info("%s\n", fio_version_string);
                                do_exit++;
                        }
                        break;
@@ -1637,7 +1636,7 @@ int parse_options(int argc, char *argv[])
        }
 
        if (!terse_output)
-               log_info("fio %s\n", fio_version_string);
+               log_info("%s\n", fio_version_string);
 
        return 0;
 }