lkml.org 
[lkml]   [2016]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 1/5] perf config: Introduce perf_config_set class
    Date
    This infrastructure code was designed for
    upcoming features of perf-config.

    That collect config key-value pairs from user and
    system config files (i.e. user wide ~/.perfconfig
    and system wide $(sysconfdir)/perfconfig)
    to manage perf's configs.

    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 | 1 +
    tools/perf/util/config.c | 123 ++++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/config.h | 21 ++++++++
    3 files changed, 145 insertions(+)
    create mode 100644 tools/perf/util/config.h

    diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
    index c42448e..412c725 100644
    --- a/tools/perf/builtin-config.c
    +++ b/tools/perf/builtin-config.c
    @@ -12,6 +12,7 @@
    #include <subcmd/parse-options.h>
    #include "util/util.h"
    #include "util/debug.h"
    +#include "util/config.h"

    static bool use_system_config, use_user_config;

    diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
    index 4e72763..b9660e4 100644
    --- a/tools/perf/util/config.c
    +++ b/tools/perf/util/config.c
    @@ -13,6 +13,7 @@
    #include <subcmd/exec-cmd.h>
    #include "util/hist.h" /* perf_hist_config */
    #include "util/llvm-utils.h" /* perf_llvm_config */
    +#include "config.h"

    #define MAXNAME (256)

    @@ -506,6 +507,128 @@ out:
    return ret;
    }

    +static struct perf_config_item *find_config(struct list_head *config_list,
    + const char *section,
    + const char *name)
    +{
    + struct perf_config_item *config;
    +
    + list_for_each_entry(config, config_list, list) {
    + if (!strcmp(config->section, section) &&
    + !strcmp(config->name, name))
    + return config;
    + }
    +
    + return NULL;
    +}
    +
    +static struct perf_config_item *add_config(struct list_head *config_list,
    + const char *section,
    + const char *name)
    +{
    + struct perf_config_item *config = zalloc(sizeof(*config));
    +
    + if (!config)
    + return NULL;
    +
    + config->section = strdup(section);
    + if (!section)
    + goto out_err;
    +
    + config->name = strdup(name);
    + if (!name) {
    + free((char *)config->section);
    + goto out_err;
    + }
    +
    + list_add_tail(&config->list, config_list);
    + return config;
    +
    +out_err:
    + free(config);
    + pr_err("%s: strdup failed\n", __func__);
    + return NULL;
    +}
    +
    +static int set_value(struct perf_config_item *config, const char *value)
    +{
    + char *val = strdup(value);
    +
    + if (!val)
    + return -1;
    + config->value = val;
    +
    + return 0;
    +}
    +
    +static int collect_config(const char *var, const char *value,
    + void *configs)
    +{
    + int ret = 0;
    + char *ptr, *key;
    + char *section, *name;
    + struct perf_config_item *config;
    + struct list_head *config_list = configs;
    +
    + key = ptr = strdup(var);
    + if (!key) {
    + pr_err("%s: strdup failed\n", __func__);
    + return -1;
    + }
    +
    + section = strsep(&ptr, ".");
    + name = ptr;
    + if (name == NULL || value == NULL) {
    + ret = -1;
    + goto out_free;
    + }
    +
    + config = find_config(config_list, section, name);
    + if (!config) {
    + config = add_config(config_list, section, name);
    + if (!config) {
    + free(config->section);
    + free(config->name);
    + ret = -1;
    + goto out_free;
    + }
    + }
    +
    + ret = set_value(config, value);
    +
    +out_free:
    + free(key);
    + return ret;
    +}
    +
    +struct perf_config_set *perf_config_set__new(void)
    +{
    + struct perf_config_set *perf_configs = zalloc(sizeof(*perf_configs));
    +
    + if (!perf_configs)
    + return NULL;
    +
    + INIT_LIST_HEAD(&perf_configs->config_list);
    + perf_config(collect_config, &perf_configs->config_list);
    +
    + return perf_configs;
    +}
    +
    +void perf_config_set__delete(struct perf_config_set *perf_configs)
    +{
    + struct perf_config_item *pos, *item;
    +
    + list_for_each_entry_safe(pos, item, &perf_configs->config_list, list) {
    + list_del(&pos->list);
    + free(pos->section);
    + free(pos->name);
    + free(pos->value);
    + free(pos);
    + }
    +
    + free(perf_configs);
    +}
    +
    /*
    * Call this to report error for your variable that should not
    * get a boolean value (i.e. "[my] var" means "true").
    diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h
    new file mode 100644
    index 0000000..44c226f
    --- /dev/null
    +++ b/tools/perf/util/config.h
    @@ -0,0 +1,21 @@
    +#ifndef __PERF_CONFIG_H
    +#define __PERF_CONFIG_H
    +
    +#include <stdbool.h>
    +#include <linux/list.h>
    +
    +struct perf_config_item {
    + char *section;
    + char *name;
    + char *value;
    + struct list_head list;
    +};
    +
    +struct perf_config_set {
    + struct list_head config_list;
    +};
    +
    +struct perf_config_set *perf_config_set__new(void);
    +void perf_config_set__delete(struct perf_config_set *perf_configs);
    +
    +#endif /* __PERF_CONFIG_H */
    --
    2.5.0
    \
     
     \ /
      Last update: 2016-03-14 14:01    [W:3.128 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site