[PATCH] Let thread exit cleanup the small allocs
[fio.git] / init.c
diff --git a/init.c b/init.c
index 8c6b2e1e336c7a572902f346336969157da3231b..0ec8e9d5ddd41f88a5e775d1a19d04ca1d001cea 100644 (file)
--- a/init.c
+++ b/init.c
@@ -65,51 +65,12 @@ static struct thread_data *get_new_job(int global, struct thread_data *parent)
                return NULL;
 
        td = &threads[thread_number++];
-       if (parent)
-               *td = *parent;
-       else
-               memset(td, 0, sizeof(*td));
+       *td = *parent;
+       td->name[0] = '\0';
 
        td->fd = -1;
        td->thread_number = thread_number;
 
-       td->ddir = parent->ddir;
-       td->ioprio = parent->ioprio;
-       td->sequential = parent->sequential;
-       td->bs = parent->bs;
-       td->min_bs = parent->min_bs;
-       td->max_bs = parent->max_bs;
-       td->odirect = parent->odirect;
-       td->thinktime = parent->thinktime;
-       td->fsync_blocks = parent->fsync_blocks;
-       td->start_delay = parent->start_delay;
-       td->timeout = parent->timeout;
-       td->io_engine = parent->io_engine;
-       td->create_file = parent->create_file;
-       td->overwrite = parent->overwrite;
-       td->invalidate_cache = parent->invalidate_cache;
-       td->file_size = parent->file_size;
-       td->file_offset = parent->file_offset;
-       td->zone_size = parent->zone_size;
-       td->zone_skip = parent->zone_skip;
-       td->rate = parent->rate;
-       td->ratemin = parent->ratemin;
-       td->ratecycle = parent->ratecycle;
-       td->iodepth = parent->iodepth;
-       td->sync_io = parent->sync_io;
-       td->mem_type = parent->mem_type;
-       td->bw_avg_time = parent->bw_avg_time;
-       td->create_serialize = parent->create_serialize;
-       td->create_fsync = parent->create_fsync;
-       td->loops = parent->loops;
-       td->verify = parent->verify;
-       td->stonewall = parent->stonewall;
-       td->numjobs = parent->numjobs;
-       td->use_thread = parent->use_thread;
-       td->do_disk_util = parent->do_disk_util;
-       memcpy(&td->cpumask, &parent->cpumask, sizeof(td->cpumask));
-       strcpy(td->io_engine_name, parent->io_engine_name);
-
        return td;
 }
 
@@ -167,12 +128,15 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        }
 
        if (td->filetype == FIO_TYPE_FILE) {
+               char tmp[PATH_MAX];
+
                if (td->directory && td->directory[0] != '\0')
-                       sprintf(td->file_name, "%s/%s.%d", td->directory, jobname, td->jobnum);
+                       sprintf(tmp, "%s/%s.%d", td->directory, jobname, td->jobnum);
                else
-                       sprintf(td->file_name, "%s.%d", jobname, td->jobnum);
+                       sprintf(tmp, "%s.%d", jobname, td->jobnum);
+               td->file_name = strdup(tmp);
        } else
-               strncpy(td->file_name, jobname, sizeof(td->file_name) - 1);
+               td->file_name = strdup(jobname);
 
        fio_sem_init(&td->mutex, 0);
 
@@ -673,7 +637,8 @@ int parse_jobs_ini(char *file)
                                continue;
 #endif
                        }
-                       if (!check_int(p, "direct", &td->odirect)) {
+                       if (!check_int(p, "direct", &il)) {
+                               td->odirect = il;
                                fgetpos(f, &off);
                                continue;
                        }
@@ -716,7 +681,8 @@ int parse_jobs_ini(char *file)
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "invalidate",&td->invalidate_cache)) {
+                       if (!check_int(p, "invalidate", &il)) {
+                               td->invalidate_cache = il;
                                fgetpos(f, &off);
                                continue;
                        }
@@ -724,7 +690,8 @@ int parse_jobs_ini(char *file)
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "sync", &td->sync_io)) {
+                       if (!check_int(p, "sync", &il)) {
+                               td->sync_io = il;
                                fgetpos(f, &off);
                                continue;
                        }
@@ -732,15 +699,18 @@ int parse_jobs_ini(char *file)
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "create_serialize", &td->create_serialize)) {
+                       if (!check_int(p, "create_serialize", &il)) {
+                               td->create_serialize = il;
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "create_fsync", &td->create_fsync)) {
+                       if (!check_int(p, "create_fsync", &il)) {
+                               td->create_fsync = il;
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "end_fsync", &td->end_fsync)) {
+                       if (!check_int(p, "end_fsync", &il)) {
+                               td->end_fsync = il;
                                fgetpos(f, &off);
                                continue;
                        }
@@ -752,7 +722,8 @@ int parse_jobs_ini(char *file)
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!check_int(p, "overwrite", &td->overwrite)) {
+                       if (!check_int(p, "overwrite", &il)) {
+                               td->overwrite = il;
                                fgetpos(f, &off);
                                continue;
                        }
@@ -861,16 +832,22 @@ int parse_jobs_ini(char *file)
                                continue;
                        }
                        if (!check_strstore(p, "iolog", tmpbuf)) {
+                               if (td->write_iolog) {
+                                       fprintf(stderr, "fio: read iolog overrides given write_iolog\n");
+                                       free(td->iolog_file);
+                                       td->write_iolog = 0;
+                               }
                                td->iolog_file = strdup(tmpbuf);
                                td->read_iolog = 1;
-                               td->write_iolog = 0;
                                fgetpos(f, &off);
                                continue;
                        }
-                       if (!td->read_iolog &&
-                           !check_strstore(p, "write_iolog", tmpbuf)) {
-                               td->iolog_file = strdup(tmpbuf);
-                               td->write_iolog = 1;
+                       if (!check_strstore(p, "write_iolog", tmpbuf)) {
+                               if (!td->read_iolog) {
+                                       td->iolog_file = strdup(tmpbuf);
+                                       td->write_iolog = 1;
+                               } else
+                                       fprintf(stderr, "fio: read iolog overrides given write_iolog\n");
                                fgetpos(f, &off);
                                continue;
                        }