syslet: we have fls(), use it for rounding ring size up
[fio.git] / init.c
diff --git a/init.c b/init.c
index 84cb2d261251062a50cf4a1a6c875e4cd87edb97..c56a3c0bb50a095588f0d09696f8e5d8e02a1005 100644 (file)
--- a/init.c
+++ b/init.c
@@ -17,7 +17,7 @@
 #include "fio.h"
 #include "parse.h"
 
-static char fio_version_string[] = "fio 1.17.1";
+static char fio_version_string[] = "fio 1.17.2";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -565,13 +565,17 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        unsigned int global;
        struct thread_data *td;
        char *string, *name;
-       fpos_t off;
        FILE *f;
        char *p;
        int ret = 0, stonewall;
        int first_sect = 1;
+       int skip_fgets = 0;
+
+       if (!strcmp(file, "-"))
+               f = stdin;
+       else
+               f = fopen(file, "r");
 
-       f = fopen(file, "r");
        if (!f) {
                perror("fopen job file");
                return 1;
@@ -587,10 +591,17 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
 
        stonewall = stonewall_flag;
        do {
-               p = fgets(string, 4095, f);
-               if (!p)
-                       break;
+               /*
+                * if skip_fgets is set, we already have loaded a line we
+                * haven't handled.
+                */
+               if (!skip_fgets) {
+                       p = fgets(string, 4095, f);
+                       if (!p)
+                               break;
+               }
 
+               skip_fgets = 0;
                strip_blank_front(&p);
                strip_blank_end(p);
 
@@ -627,20 +638,23 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
                        stonewall = 0;
                }
 
-               fgetpos(f, &off);
                while ((p = fgets(string, 4096, f)) != NULL) {
                        if (is_empty_or_comment(p))
                                continue;
 
                        strip_blank_front(&p);
 
-                       if (p[0] == '[')
+                       /*
+                        * new section, break out and make sure we don't
+                        * fgets() a new line at the top.
+                        */
+                       if (p[0] == '[') {
+                               skip_fgets = 1;
                                break;
+                       }
 
                        strip_blank_end(p);
 
-                       fgetpos(f, &off);
-
                        /*
                         * Don't break here, continue parsing options so we
                         * dump all the bad ones. Makes trial/error fixups
@@ -651,10 +665,9 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
                                log_info("--%s ", p);
                }
 
-               if (!ret) {
-                       fsetpos(f, &off);
+               if (!ret)
                        ret = add_job(td, name, 0);
-               else {
+               else {
                        log_err("fio: job %s dropped\n", name);
                        put_job(td);
                }
@@ -665,7 +678,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
 
        free(string);
        free(name);
-       fclose(f);
+       if (f != stdin)
+               fclose(f);
        return ret;
 }
 
@@ -732,6 +746,7 @@ static int setup_thread_area(void)
                return 1;
        }
 
+       memset(threads, 0, max_jobs * sizeof(struct thread_data));
        atexit(free_shm);
        return 0;
 }