diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2015-12-15 16:39:35 +0100 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-12-16 20:18:16 +0100 |
commit | 096d35585b4fce7d3ee9b8b34314f39f49491ab1 (patch) | |
tree | 943117cf4968b21676cea2ba7d1c65d0d74370e2 /tools | |
parent | perf tools: Document the fact that parse_options*() may exit (diff) | |
download | linux-096d35585b4fce7d3ee9b8b34314f39f49491ab1.tar.xz linux-096d35585b4fce7d3ee9b8b34314f39f49491ab1.zip |
perf tools: Provide subcmd configuration at runtime
Create init functions for exec_cmd.c and pager.c. This allows their
configuration to be specified at runtime so they can be split out into a
separate library which can be used by other programs. Their
configuration is stored in a shared subcmd_config struct.
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/21f5f6b38da72c985a8dcfa185700d03e7eecd1d.1450193761.git.jpoimboe@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/Build | 5 | ||||
-rw-r--r-- | tools/perf/perf.c | 6 | ||||
-rw-r--r-- | tools/perf/util/Build | 2 | ||||
-rw-r--r-- | tools/perf/util/cache.h | 1 | ||||
-rw-r--r-- | tools/perf/util/exec_cmd.c | 23 | ||||
-rw-r--r-- | tools/perf/util/exec_cmd.h | 3 | ||||
-rw-r--r-- | tools/perf/util/pager.c | 8 | ||||
-rw-r--r-- | tools/perf/util/pager.h | 2 | ||||
-rw-r--r-- | tools/perf/util/parse-options.c | 4 | ||||
-rw-r--r-- | tools/perf/util/subcmd-config.c | 11 | ||||
-rw-r--r-- | tools/perf/util/subcmd-config.h | 14 |
11 files changed, 67 insertions, 12 deletions
diff --git a/tools/perf/Build b/tools/perf/Build index 2a41217e9d88..00c4b8c3d8ca 100644 --- a/tools/perf/Build +++ b/tools/perf/Build @@ -36,7 +36,10 @@ paths += -DPERF_MAN_PATH="BUILD_STR($(mandir_SQ))" CFLAGS_builtin-help.o += $(paths) CFLAGS_builtin-timechart.o += $(paths) -CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" -include $(OUTPUT)PERF-VERSION-FILE +CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" \ + -DPERF_EXEC_PATH="BUILD_STR($(perfexecdir_SQ))" \ + -DPREFIX="BUILD_STR($(prefix_SQ))" \ + -include $(OUTPUT)PERF-VERSION-FILE CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_SQ))" libperf-y += util/ diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 59ea48c7e26c..783a3310a9d8 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -119,7 +119,7 @@ static void commit_pager_choice(void) { switch (use_pager) { case 0: - setenv("PERF_PAGER", "cat", 1); + setenv(PERF_PAGER_ENVIRONMENT, "cat", 1); break; case 1: /* setup_pager(); */ @@ -530,6 +530,10 @@ int main(int argc, const char **argv) const char *cmd; char sbuf[STRERR_BUFSIZE]; + /* libsubcmd init */ + exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT); + pager_init(PERF_PAGER_ENVIRONMENT); + /* The page_size is placed in util object. */ page_size = sysconf(_SC_PAGE_SIZE); cacheline_size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 99b3dae57806..196beefa16a9 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -88,6 +88,7 @@ libperf-y += parse-branch-options.o libperf-y += parse-regs-options.o libperf-y += term.o libperf-y += help-unknown-cmd.o +libperf-y += subcmd-config.o libperf-$(CONFIG_LIBBPF) += bpf-loader.o libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o @@ -113,7 +114,6 @@ libperf-$(CONFIG_ZLIB) += zlib.o libperf-$(CONFIG_LZMA) += lzma.o CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))" -CFLAGS_exec_cmd.o += -DPERF_EXEC_PATH="BUILD_STR($(perfexecdir_SQ))" -DPREFIX="BUILD_STR($(prefix_SQ))" $(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c $(call rule_mkdir) diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index d723ecb9b959..fc6a745d2ec6 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -21,6 +21,7 @@ #define DEFAULT_PERF_DIR_ENVIRONMENT ".perf" #define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" #define PERF_TRACEFS_ENVIRONMENT "PERF_TRACEFS_DIR" +#define PERF_PAGER_ENVIRONMENT "PERF_PAGER" typedef int (*config_fn_t)(const char *, const char *, void *); extern int perf_default_config(const char *, const char *, void *); diff --git a/tools/perf/util/exec_cmd.c b/tools/perf/util/exec_cmd.c index 1099e92f5ee1..b935e4ce62a2 100644 --- a/tools/perf/util/exec_cmd.c +++ b/tools/perf/util/exec_cmd.c @@ -1,6 +1,7 @@ #include "cache.h" #include "exec_cmd.h" #include "quote.h" +#include "subcmd-config.h" #include <string.h> @@ -9,15 +10,23 @@ static const char *argv_exec_path; static const char *argv0_path; +void exec_cmd_init(const char *exec_name, const char *prefix, + const char *exec_path, const char *exec_path_env) +{ + subcmd_config.exec_name = exec_name; + subcmd_config.prefix = prefix; + subcmd_config.exec_path = exec_path; + subcmd_config.exec_path_env = exec_path_env; +} + char *system_path(const char *path) { - static const char *prefix = PREFIX; struct strbuf d = STRBUF_INIT; if (is_absolute_path(path)) return strdup(path); - strbuf_addf(&d, "%s/%s", prefix, path); + strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path); path = strbuf_detach(&d, NULL); return (char *)path; } @@ -47,7 +56,7 @@ void perf_set_argv_exec_path(const char *exec_path) /* * Propagate this setting to external programs. */ - setenv(EXEC_PATH_ENVIRONMENT, exec_path, 1); + setenv(subcmd_config.exec_path_env, exec_path, 1); } @@ -59,11 +68,11 @@ char *perf_exec_path(void) if (argv_exec_path) return strdup(argv_exec_path); - env = getenv(EXEC_PATH_ENVIRONMENT); + env = getenv(subcmd_config.exec_path_env); if (env && *env) return strdup(env); - return system_path(PERF_EXEC_PATH); + return system_path(subcmd_config.exec_path); } static void add_path(struct strbuf *out, const char *path) @@ -107,7 +116,7 @@ static const char **prepare_perf_cmd(const char **argv) ; /* just counting */ nargv = malloc(sizeof(*nargv) * (argc + 2)); - nargv[0] = "perf"; + nargv[0] = subcmd_config.exec_name; for (argc = 0; argv[argc]; argc++) nargv[argc + 1] = argv[argc]; nargv[argc + 1] = NULL; @@ -118,7 +127,7 @@ int execv_perf_cmd(const char **argv) { const char **nargv = prepare_perf_cmd(argv); /* execvp() can only ever return if it fails */ - execvp("perf", (char **)nargv); + execvp(subcmd_config.exec_name, (char **)nargv); free(nargv); return -1; diff --git a/tools/perf/util/exec_cmd.h b/tools/perf/util/exec_cmd.h index 48b4175f1e11..fd4434e48d21 100644 --- a/tools/perf/util/exec_cmd.h +++ b/tools/perf/util/exec_cmd.h @@ -1,6 +1,9 @@ #ifndef __PERF_EXEC_CMD_H #define __PERF_EXEC_CMD_H +extern void exec_cmd_init(const char *exec_name, const char *prefix, + const char *exec_path, const char *exec_path_env); + extern void perf_set_argv_exec_path(const char *exec_path); extern const char *perf_extract_argv0_path(const char *path); extern void setup_path(void); diff --git a/tools/perf/util/pager.c b/tools/perf/util/pager.c index 7dcbef64b609..d5ef62eaa413 100644 --- a/tools/perf/util/pager.c +++ b/tools/perf/util/pager.c @@ -1,6 +1,7 @@ #include "cache.h" #include "run-command.h" #include "sigchain.h" +#include "subcmd-config.h" /* * This is split up from the rest of git so that we can do @@ -9,6 +10,11 @@ static int spawned_pager; +void pager_init(const char *pager_env) +{ + subcmd_config.pager_env = pager_env; +} + static void pager_preexec(void) { /* @@ -46,7 +52,7 @@ static void wait_for_pager_signal(int signo) void setup_pager(void) { - const char *pager = getenv("PERF_PAGER"); + const char *pager = getenv(subcmd_config.pager_env); if (!isatty(1)) return; diff --git a/tools/perf/util/pager.h b/tools/perf/util/pager.h index 2794a83b7e85..d6a591a4c017 100644 --- a/tools/perf/util/pager.h +++ b/tools/perf/util/pager.h @@ -1,6 +1,8 @@ #ifndef __PERF_PAGER_H #define __PERF_PAGER_H +extern void pager_init(const char *pager_env); + extern void setup_pager(void); extern int pager_in_use(void); diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index 0ad1384783dd..da4ba21cad21 100644 --- a/tools/perf/util/parse-options.c +++ b/tools/perf/util/parse-options.c @@ -2,6 +2,7 @@ #include "parse-options.h" #include "cache.h" #include "header.h" +#include "subcmd-config.h" #include <linux/string.h> #define OPT_SHORT 1 @@ -577,7 +578,8 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o if (subcommands && !usagestr[0]) { struct strbuf buf = STRBUF_INIT; - strbuf_addf(&buf, "perf %s [<options>] {", argv[0]); + strbuf_addf(&buf, "%s %s [<options>] {", + subcmd_config.exec_name, argv[0]); for (int i = 0; subcommands[i]; i++) { if (i) strbuf_addstr(&buf, "|"); diff --git a/tools/perf/util/subcmd-config.c b/tools/perf/util/subcmd-config.c new file mode 100644 index 000000000000..d017c728bd1b --- /dev/null +++ b/tools/perf/util/subcmd-config.c @@ -0,0 +1,11 @@ +#include "subcmd-config.h" + +#define UNDEFINED "SUBCMD_HAS_NOT_BEEN_INITIALIZED" + +struct subcmd_config subcmd_config = { + .exec_name = UNDEFINED, + .prefix = UNDEFINED, + .exec_path = UNDEFINED, + .exec_path_env = UNDEFINED, + .pager_env = UNDEFINED, +}; diff --git a/tools/perf/util/subcmd-config.h b/tools/perf/util/subcmd-config.h new file mode 100644 index 000000000000..cc8514030b5c --- /dev/null +++ b/tools/perf/util/subcmd-config.h @@ -0,0 +1,14 @@ +#ifndef __PERF_SUBCMD_CONFIG_H +#define __PERF_SUBCMD_CONFIG_H + +struct subcmd_config { + const char *exec_name; + const char *prefix; + const char *exec_path; + const char *exec_path_env; + const char *pager_env; +}; + +extern struct subcmd_config subcmd_config; + +#endif /* __PERF_SUBCMD_CONFIG_H */ |