aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/lib
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2019-07-21 07:24:14 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2019-07-29 17:34:44 -0400
commita1556f8479ed58b8d5a33aef54578bad0165c7e7 (patch)
treef00f4e19160f6b4d5663f53dc8cc06424b12fddf /tools/perf/lib
parent5b7f445d684fc287a2101e29d42d1fee19ae14ff (diff)
libperf: Add debug output support
Add the perf_set_print() function to allow setting an output function for warn/info/debug messages. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexey Budankov <alexey.budankov@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Michael Petlan <mpetlan@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20190721112506.12306-28-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/lib')
-rw-r--r--tools/perf/lib/core.c34
-rw-r--r--tools/perf/lib/include/perf/core.h13
-rw-r--r--tools/perf/lib/internal.h18
-rw-r--r--tools/perf/lib/libperf.map2
4 files changed, 67 insertions, 0 deletions
diff --git a/tools/perf/lib/core.c b/tools/perf/lib/core.c
index e69de29bb2d1..29d5e3348718 100644
--- a/tools/perf/lib/core.c
+++ b/tools/perf/lib/core.c
@@ -0,0 +1,34 @@
1// SPDX-License-Identifier: GPL-2.0-only
2
3#define __printf(a, b) __attribute__((format(printf, a, b)))
4
5#include <stdio.h>
6#include <stdarg.h>
7#include <perf/core.h>
8#include "internal.h"
9
10static int __base_pr(enum libperf_print_level level, const char *format,
11 va_list args)
12{
13 return vfprintf(stderr, format, args);
14}
15
16static libperf_print_fn_t __libperf_pr = __base_pr;
17
18void libperf_set_print(libperf_print_fn_t fn)
19{
20 __libperf_pr = fn;
21}
22
23__printf(2, 3)
24void libperf_print(enum libperf_print_level level, const char *format, ...)
25{
26 va_list args;
27
28 if (!__libperf_pr)
29 return;
30
31 va_start(args, format);
32 __libperf_pr(level, format, args);
33 va_end(args);
34}
diff --git a/tools/perf/lib/include/perf/core.h b/tools/perf/lib/include/perf/core.h
index e2e4b43c9131..c341a7b2c874 100644
--- a/tools/perf/lib/include/perf/core.h
+++ b/tools/perf/lib/include/perf/core.h
@@ -2,8 +2,21 @@
2#ifndef __LIBPERF_CORE_H 2#ifndef __LIBPERF_CORE_H
3#define __LIBPERF_CORE_H 3#define __LIBPERF_CORE_H
4 4
5#include <stdarg.h>
6
5#ifndef LIBPERF_API 7#ifndef LIBPERF_API
6#define LIBPERF_API __attribute__((visibility("default"))) 8#define LIBPERF_API __attribute__((visibility("default")))
7#endif 9#endif
8 10
11enum libperf_print_level {
12 LIBPERF_WARN,
13 LIBPERF_INFO,
14 LIBPERF_DEBUG,
15};
16
17typedef int (*libperf_print_fn_t)(enum libperf_print_level level,
18 const char *, va_list ap);
19
20LIBPERF_API void libperf_set_print(libperf_print_fn_t fn);
21
9#endif /* __LIBPERF_CORE_H */ 22#endif /* __LIBPERF_CORE_H */
diff --git a/tools/perf/lib/internal.h b/tools/perf/lib/internal.h
new file mode 100644
index 000000000000..dc92f241732e
--- /dev/null
+++ b/tools/perf/lib/internal.h
@@ -0,0 +1,18 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __LIBPERF_INTERNAL_H
3#define __LIBPERF_INTERNAL_H
4
5void libperf_print(enum libperf_print_level level,
6 const char *format, ...)
7 __attribute__((format(printf, 2, 3)));
8
9#define __pr(level, fmt, ...) \
10do { \
11 libperf_print(level, "libperf: " fmt, ##__VA_ARGS__); \
12} while (0)
13
14#define pr_warning(fmt, ...) __pr(LIBPERF_WARN, fmt, ##__VA_ARGS__)
15#define pr_info(fmt, ...) __pr(LIBPERF_INFO, fmt, ##__VA_ARGS__)
16#define pr_debug(fmt, ...) __pr(LIBPERF_DEBUG, fmt, ##__VA_ARGS__)
17
18#endif /* __LIBPERF_INTERNAL_H */
diff --git a/tools/perf/lib/libperf.map b/tools/perf/lib/libperf.map
index a8e913988edf..3536242c545c 100644
--- a/tools/perf/lib/libperf.map
+++ b/tools/perf/lib/libperf.map
@@ -1,4 +1,6 @@
1LIBPERF_0.0.1 { 1LIBPERF_0.0.1 {
2 global:
3 libperf_set_print;
2 local: 4 local:
3 *; 5 *;
4}; 6};