perf tools: Asprintf like functions to format integer filter expression
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 93ec4ce789995c5c58dff82193b3ec77caa8aecb Gitweb: http://git.kernel.org/tip/93ec4ce789995c5c58dff82193b3ec77caa8aecb Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 2 Jul 2015 17:48:23 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 6 Jul 2015 10:21:46 -0300
perf tools: Asprintf like functions to format integer filter expression
char *asprintf_expr_in_ints(const char *var, size_t nints, int *ints); char *asprintf_expr_not_in_ints(const char *var, size_t nints, int *ints);
Example of output formatted with those functions:
# ./tp_filter 6 12 2015 asprintf_expr_in_ints: id == 6 || id == 12 || id == 2015 asprintf_expr_not_in_ints: id != 6 && id != 12 && id != 2015 #
It'll be used with, for instance, perf_evsel__set_filter_in_ints(), that will be used in turn to ask the kernel to filter out all raw_syscalls:* except for the ones specified by the user via:
$ perf trace -e some,list,of,syscalls
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/string.c | 39 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 12 ++++++++++++ 2 files changed, 51 insertions(+)
tools/perf/util/string.c +39 -0
@@ -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 ; +}
tools/perf/util/util.h +12 -0
@@ -339,4 +339,16 @@ int gzip_decompress_to_file(const char *input, int output_fd);int lzma_decompress_to_file (const char *input,int output_fd);#endif +char *asprintf_expr_inout_ints (const char *var,bool in,size_t nints,int *ints); + +static inline char *asprintf_expr_in_ints (const char *var,size_t nints,int *ints) +{ +return asprintf_expr_inout_ints (var, true, nints, ints); +} + +static inline char *asprintf_expr_not_in_ints (const char *var,size_t nints,int *ints) +{ +return asprintf_expr_inout_ints (var, false, nints, ints); +} +#endif /* GIT_COMPAT_UTIL_H */