iolog: don't serialize the writing of all logs
[fio.git] / init.c
diff --git a/init.c b/init.c
index 9b0666d74e5651aa566dbae890715e644c62acc7..910f2badbcfda054d8a6f300575093eabb572924 100644 (file)
--- a/init.c
+++ b/init.c
 #include "profile.h"
 #include "server.h"
 #include "idletime.h"
+#include "filelock.h"
 
 #include "lib/getopt.h"
 #include "lib/strcasestr.h"
 
+#include "crc/test.h"
+
 const char fio_version_string[] = FIO_VERSION;
 
 #define FIO_RANDSEED           (0xb1899bedUL)
@@ -40,6 +43,8 @@ static int parse_only;
 
 static struct thread_data def_thread;
 struct thread_data *threads = NULL;
+static char **job_sections;
+static int nr_job_sections;
 
 int exitall_on_terminate = 0;
 int output_format = FIO_OUTPUT_NORMAL;
@@ -48,8 +53,6 @@ int eta_print = FIO_ETA_AUTO;
 int eta_new_line = 0;
 FILE *f_out = NULL;
 FILE *f_err = NULL;
-char **job_sections = NULL;
-int nr_job_sections = 0;
 char *exec_profile = NULL;
 int warnings_fatal = 0;
 int terse_version = 3;
@@ -247,7 +250,7 @@ void free_threads_shm(void)
        }
 }
 
-void free_shm(void)
+static void free_shm(void)
 {
        if (threads) {
                file_hash_exit();
@@ -257,6 +260,7 @@ void free_shm(void)
        }
 
        options_free(fio_options, &def_thread);
+       fio_filelock_exit();
        scleanup();
 }
 
@@ -1087,12 +1091,12 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
        if (setup_rate(td))
                goto err;
 
-       if (o->lat_log_file) {
+       if (o->lat_log_file || write_lat_log) {
                setup_log(&td->lat_log, o->log_avg_msec, IO_LOG_TYPE_LAT);
                setup_log(&td->slat_log, o->log_avg_msec, IO_LOG_TYPE_SLAT);
                setup_log(&td->clat_log, o->log_avg_msec, IO_LOG_TYPE_CLAT);
        }
-       if (o->bw_log_file)
+       if (o->bw_log_file || write_bw_log)
                setup_log(&td->bw_log, o->log_avg_msec, IO_LOG_TYPE_BW);
        if (o->iops_log_file)
                setup_log(&td->iops_log, o->log_avg_msec, IO_LOG_TYPE_IOPS);
@@ -1160,17 +1164,18 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                td_new->o.new_group = 0;
 
                if (file_alloced) {
-                       td_new->files_index = 0;
-                       td_new->files_size = 0;
                        if (td_new->files) {
                                struct fio_file *f;
                                for_each_file(td_new, f, i) {
                                        if (f->file_name)
-                                               free(f->file_name);
-                                       free(f);
+                                               sfree(f->file_name);
+                                       sfree(f);
                                }
+                               free(td_new->files);
                                td_new->files = NULL;
                        }
+                       td_new->files_index = 0;
+                       td_new->files_size = 0;
                        if (td_new->o.filename) {
                                free(td_new->o.filename);
                                td_new->o.filename = NULL;
@@ -1657,13 +1662,11 @@ static int client_flag_set(char c)
        return 0;
 }
 
-void parse_cmd_client(void *client, char *opt)
+static void parse_cmd_client(void *client, char *opt)
 {
        fio_client_add_cmd_option(client, opt);
 }
 
-extern int fio_crctest(const char *);
-
 int parse_cmd_line(int argc, char *argv[], int client_type)
 {
        struct thread_data *td = NULL;
@@ -1938,7 +1941,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                case 'L': {
                        long long val;
 
-                       if (check_str_time(optarg, &val, 1)) {
+                       if (check_str_time(optarg, &val, 0)) {
                                log_err("fio: failed parsing time %s\n", optarg);
                                do_exit++;
                                exit_val = 1;
@@ -1962,11 +1965,8 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
        if (do_exit && !(is_backend || nr_clients))
                exit(exit_val);
 
-       if (nr_clients && fio_clients_connect()) {
-               do_exit++;
-               exit_val = 1;
-               return -1;
-       }
+       if (nr_clients && fio_clients_connect())
+               exit(1);
 
        if (is_backend && backend)
                return fio_start_server(pid_file);