diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-07-06 17:46:15 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-07-06 17:46:15 +0200 |
commit | 60cd37eb100c4880b28078a47f3062fac7572095 (patch) | |
tree | 5cb03265f2ab74735f8d479d7bb7d85d8aa9e092 /tools/perf/util/string.c | |
parent | ebf2d2689de551d90965090bb991fc640a0c0d41 (diff) | |
parent | ab85785aa13c36440a91a8e9f7616357de411a1f (diff) |
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
User visible changes:
- Take tracefs into account when reporting errors about accessing
tracepoint information in tools like 'perf trace' (Arnaldo Carvalho de Melo)
- Let user have timestamps with per-thread recording in 'perf record' (Adrian Hunter)
Infrastructure changes:
- Introduce series of functions to build event filters so that we
can set them in just one ioctl call, useful to set up common_pid,
raw_syscalls:sys_{enter,exit}'s "id" filters to use with
'perf trace' (Arnaldo Carvalho de Melo)
- Delete an unnecessary check before calling strfilter__delete() (Markus Elfring)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/string.c')
-rw-r--r-- | tools/perf/util/string.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c index 6afd6106ceb51..fc8781de62dbb 100644 --- a/tools/perf/util/string.c +++ b/tools/perf/util/string.c @@ -357,3 +357,42 @@ void *memdup(const void *src, size_t len) return p; } + +char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints) +{ + /* + * FIXME: replace this with an expression using log10() when we + * find a suitable implementation, maybe the one in the dvb drivers... + * + * "%s == %d || " = log10(MAXINT) * 2 + 8 chars for the operators + */ + size_t size = nints * 28 + 1; /* \0 */ + size_t i, printed = 0; + char *expr = malloc(size); + + if (expr) { + const char *or_and = "||", *eq_neq = "=="; + char *e = expr; + + if (!in) { + or_and = "&&"; + eq_neq = "!="; + } + + for (i = 0; i < nints; ++i) { + if (printed == size) + goto out_err_overflow; + + if (i > 0) + printed += snprintf(e + printed, size - printed, " %s ", or_and); + printed += scnprintf(e + printed, size - printed, + "%s %s %d", var, eq_neq, ints[i]); + } + } + + return expr; + +out_err_overflow: + free(expr); + return NULL; +} |