Re: [PATCH v3 4/4] perf config: Initialize perf_config_set with all default configs

From: Namhyung Kim
Date: Thu Mar 24 2016 - 02:13:29 EST


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@xxxxxxxxxx>
> Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
> Signed-off-by: Taeung Song <treeze.taeung@xxxxxxxxx>
> ---
> 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, &section->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(&section->config_items);
> +
> + config_items = default_config_items[i];
> + for (j = 0; config_items[j].name != NULL; j++)
> + list_add_tail(&config_items[j].list, &section->config_items);
> +
> + list_add_tail(&section->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,
> &section->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(&section->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
>