Messages in this thread | | | Date | Thu, 24 Mar 2016 15:13:17 +0900 | From | Namhyung Kim <> | Subject | Re: [PATCH v3 4/4] perf config: Initialize perf_config_set with all default configs |
| |
On Thu, Mar 24, 2016 at 05:16:33AM +0900, Taeung Song wrote: > To avoid duplicated config variables and > use perf_config_set classifying between standard > perf config variables and unknown or new config > variables other than them, initialize perf_config_set > with all default configs. > > And this will be needed when showing all configs with > default value or checking correct type of a config > variable in the near future. > > Cc: Namhyung Kim <namhyung@kernel.org> > Cc: Jiri Olsa <jolsa@kernel.org> > Signed-off-by: Taeung Song <treeze.taeung@gmail.com> > --- > tools/perf/builtin-config.c | 11 +++++++---- > tools/perf/util/config.c | 35 +++++++++++++++++++++++++++++------ > tools/perf/util/config.h | 6 ++++++ > 3 files changed, 42 insertions(+), 10 deletions(-) > > diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c > index c7cf34f..9e2adad 100644 > --- a/tools/perf/builtin-config.c > +++ b/tools/perf/builtin-config.c > @@ -35,23 +35,26 @@ static struct option config_options[] = { > > static int show_config(struct perf_config_set *perf_configs) > { > + bool has_value = false; > struct perf_config_section *section; > struct perf_config_item *config_item; > struct list_head *sections = &perf_configs->sections; > > - if (list_empty(sections)) > - return -1; > - > list_for_each_entry(section, sections, list) { > list_for_each_entry(config_item, §ion->config_items, list) { > char *value = config_item->value; > > - if (value) > + if (value) { > printf("%s.%s=%s\n", section->name, > config_item->name, value); > + has_value = true; > + } > } > } > > + if (!has_value) > + return -1; > + > return 0; > } > > diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c > index e3e6ef4..725015f 100644 > --- a/tools/perf/util/config.c > +++ b/tools/perf/util/config.c > @@ -746,6 +746,29 @@ out_free: > return ret; > } > > +static struct perf_config_set *perf_config_set__init(struct perf_config_set *perf_configs) > +{ > + int i, j; > + struct perf_config_section *section; > + struct perf_config_item *config_items; > + struct list_head *sections = &perf_configs->sections; > + > + INIT_LIST_HEAD(&perf_configs->sections); > + > + for (i = 0; i != CONFIG_END; i++) { > + section = &default_sections[i]; > + INIT_LIST_HEAD(§ion->config_items); > + > + config_items = default_config_items[i]; > + for (j = 0; config_items[j].name != NULL; j++) > + list_add_tail(&config_items[j].list, §ion->config_items); > + > + list_add_tail(§ion->list, sections); > + } > + > + return perf_configs; > +} > + > struct perf_config_set *perf_config_set__new(void) > { > struct perf_config_set *perf_configs = zalloc(sizeof(*perf_configs)); > @@ -753,7 +776,7 @@ struct perf_config_set *perf_config_set__new(void) > if (!perf_configs) > return NULL; > > - INIT_LIST_HEAD(&perf_configs->sections); > + perf_config_set__init(perf_configs); > perf_config(collect_config, &perf_configs->sections); > > return perf_configs; > @@ -769,13 +792,13 @@ void perf_config_set__delete(struct perf_config_set *perf_configs) > list_for_each_entry_safe(config_item, item_tmp, > §ion->config_items, list) { > list_del(&config_item->list); > - free((char *)config_item->name); > - free(config_item->value); > - free(config_item); > + if (config_item->is_custom) {
Where did you set the ->is_custom?
> + free((char *)config_item->name); > + free(config_item->value); > + free(config_item); > + } > } > list_del(§ion->list); > - free((char *)section->name); > - free(section);
Hmm.. I think the section also has to have something like is_custom flag since the config file may have some sections/items currently don't aware of. That would be needed for forward-compatibility IMHO.
Thanks, Namhyung
> } > > free(perf_configs); > diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h > index aa4a5a2..33cf9db 100644 > --- a/tools/perf/util/config.h > +++ b/tools/perf/util/config.h > @@ -14,6 +14,11 @@ enum perf_config_type { > CONFIG_TYPE_STRING > }; > > +/** > + * struct perf_config_item - element of perf's configs > + * > + * @is_custom: unknown or new config other than default config > + */ > struct perf_config_item { > const char *name; > char *value; > @@ -27,6 +32,7 @@ struct perf_config_item { > const char *s; > } default_value; > enum perf_config_type type; > + bool is_custom; > struct list_head list; > }; > > -- > 2.5.0 >
| |