Messages in this thread Patch in this message | | | From | Taeung Song <> | Subject | [RESEND][PATCH v3 4/4] perf config: Initialize perf_config_set with all default configs | Date | Thu, 24 Mar 2016 16:14:15 +0900 |
| |
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 | 40 ++++++++++++++++++++++++++++++++++------ tools/perf/util/config.h | 7 +++++++ 3 files changed, 48 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 df9f0dd..2cfafff 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c @@ -678,6 +678,7 @@ static struct perf_config_item *add_config_item(struct perf_config_section *sect if (!config_item) return NULL; + config_item->is_custom = true; config_item->name = strdup(name); if (!name) { pr_err("%s: strdup failed\n", __func__); @@ -748,6 +749,29 @@ out_free: return -1; } +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)); @@ -755,7 +779,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); return perf_configs; @@ -771,13 +795,17 @@ 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) { + free((char *)config_item->name); + free(config_item->value); + free(config_item); + } } list_del(§ion->list); - free((char *)section->name); - free(section); + if (section->is_custom) { + free((char *)section->name); + free(section); + } } free(perf_configs); diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h index aa4a5a2..647842b 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,11 +32,13 @@ struct perf_config_item { const char *s; } default_value; enum perf_config_type type; + bool is_custom; struct list_head list; }; struct perf_config_section { const char *name; + bool is_custom; struct list_head config_items; struct list_head list; }; -- 2.5.0
| |