From: Jens Axboe Date: Fri, 23 Mar 2007 14:57:56 +0000 (+0100) Subject: Free/alloc every FIO_OPT_STR_STORE string X-Git-Tag: fio-1.15~41^2 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=d23bb327374520295509bbd98912c8091b701a3e Free/alloc every FIO_OPT_STR_STORE string Makes ownership clear, though the freeing is a bit anal. Signed-off-by: Jens Axboe --- diff --git a/fio.c b/fio.c index 9fabbe93..f6c3fc8f 100644 --- a/fio.c +++ b/fio.c @@ -878,6 +878,7 @@ err: close_files(td); close_ioengine(td); cleanup_io_u(td); + options_mem_free(td); td_set_runstate(td, TD_EXITED); return (void *) (unsigned long) td->error; err_sem: diff --git a/fio.h b/fio.h index 8a79289c..736fefb1 100644 --- a/fio.h +++ b/fio.h @@ -691,6 +691,8 @@ extern int fio_cmd_option_parse(struct thread_data *, const char *, char *); extern void fio_fill_default_options(struct thread_data *); extern int fio_show_option_help(const char *); extern void fio_options_dup_and_init(struct option *); +extern void options_mem_dupe(struct thread_data *); +extern void options_mem_free(struct thread_data *); #define FIO_GETOPT_JOB 0x89988998 #define FIO_NR_OPTIONS 128 diff --git a/init.c b/init.c index e5d776c2..c1f774d8 100644 --- a/init.c +++ b/init.c @@ -116,6 +116,7 @@ static struct thread_data *get_new_job(int global, struct thread_data *parent) *td = *parent; dup_files(td, parent); + options_mem_dupe(td); td->thread_number = thread_number; return td; @@ -801,6 +802,7 @@ int parse_options(int argc, char *argv[]) } free(ini_file); + options_mem_free(&def_thread); if (!thread_number) { log_err("No jobs defined(s)\n"); diff --git a/options.c b/options.c index 4f30f2c1..7d4396e8 100644 --- a/options.c +++ b/options.c @@ -864,3 +864,39 @@ int fio_show_option_help(const char *opt) { return show_cmd_help(options, opt); } + +static void __options_mem(struct thread_data *td, int alloc) +{ + struct thread_options *o = &td->o; + struct fio_option *opt; + char **ptr; + int i; + + for (i = 0, opt = &options[0]; opt->name; i++, opt = &options[i]) { + if (opt->type != FIO_OPT_STR_STORE) + continue; + + ptr = (void *) o + opt->off1; + if (*ptr) { + if (alloc) + *ptr = strdup(*ptr); + else { + free(*ptr); + *ptr = NULL; + } + } + } +} + +/* + * dupe FIO_OPT_STR_STORE options + */ +void options_mem_dupe(struct thread_data *td) +{ + __options_mem(td, 1); +} + +void options_mem_free(struct thread_data *td) +{ + __options_mem(td, 0); +}