Re: [RFC PATCH v4 05/29] bpf tools: Allow caller to set printing function

2015-05-29 Thread Namhyung Kim
Hi Wang,

On Wed, May 27, 2015 at 05:19:40AM +, Wang Nan wrote:
> By libbpf_set_print(), users of libbpf are allowed to register he/she
> own debug, info and warning printing functions. Libbpf will use those
> functions to print messages. If not provided, default info and warning
> printing functions are fprintf(stderr, ...); defailt debug printing
> is NULL.
> 
> This API is designed to be used by perf, enables it to register its own
> logging functions to make all logs uniform, instead of separated
> logging level control.
> 
> Acked-by: Alexei Starovoitov 
> Signed-off-by: Wang Nan 
> ---
>  tools/lib/bpf/libbpf.c | 43 +++
>  tools/lib/bpf/libbpf.h |  4 
>  2 files changed, 47 insertions(+)
> 
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index c08d6bc..49091c3 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -7,8 +7,51 @@
>   */
>  
>  #include 
> +#include 
> +#include 
> +#include 
>  #include 
>  #include 
>  #include 
>  
>  #include "libbpf.h"
> +
> +#define __printf(a, b)   __attribute__((format(printf, a, b)))
> +
> +__printf(1, 2)
> +static int __base_pr(const char *format, ...)
> +{
> + va_list args;
> + int err;
> +
> + va_start(args, format);
> + err = vfprintf(stderr, format, args);
> + va_end(args);
> + return err;
> +}
> +
> +static __printf(1, 2) int (*__pr_warning)(const char *format, ...) =
> + __base_pr;
> +static __printf(1, 2) int (*__pr_info)(const char *format, ...) =
> + __base_pr;
> +static __printf(1, 2) int (*__pr_debug)(const char *format, ...) =
> + NULL;

What about using typedef for this.. like print_fn_t ?

Thanks,
Namhyung


> +
> +#define __pr(func, fmt, ...) \
> +do { \
> + if ((func)) \
> + (func)("libbpf: " fmt, ##__VA_ARGS__); \
> +} while(0)
> +
> +#define pr_warning(fmt, ...) __pr(__pr_warning, fmt, ##__VA_ARGS__)
> +#define pr_info(fmt, ...)__pr(__pr_info, fmt, ##__VA_ARGS__)
> +#define pr_debug(fmt, ...)   __pr(__pr_debug, fmt, ##__VA_ARGS__)
> +
> +void libbpf_set_print(int (*warn)(const char *format, ...),
> +   int (*info)(const char *format, ...),
> +   int (*debug)(const char *format, ...))
> +{
> + __pr_warning = warn;
> + __pr_info = info;
> + __pr_debug = debug;
> +}
> diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
> index a6f46d9..430b122 100644
> --- a/tools/lib/bpf/libbpf.h
> +++ b/tools/lib/bpf/libbpf.h
> @@ -8,4 +8,8 @@
>  #ifndef __BPF_LIBBPF_H
>  #define __BPF_LIBBPF_H
>  
> +void libbpf_set_print(int (*warn)(const char *format, ...),
> +   int (*info)(const char *format, ...),
> +   int (*debug)(const char *format, ...));
> +
>  #endif
> -- 
> 1.8.3.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC PATCH v4 05/29] bpf tools: Allow caller to set printing function

2015-05-26 Thread Wang Nan
By libbpf_set_print(), users of libbpf are allowed to register he/she
own debug, info and warning printing functions. Libbpf will use those
functions to print messages. If not provided, default info and warning
printing functions are fprintf(stderr, ...); defailt debug printing
is NULL.

This API is designed to be used by perf, enables it to register its own
logging functions to make all logs uniform, instead of separated
logging level control.

Acked-by: Alexei Starovoitov 
Signed-off-by: Wang Nan 
---
 tools/lib/bpf/libbpf.c | 43 +++
 tools/lib/bpf/libbpf.h |  4 
 2 files changed, 47 insertions(+)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index c08d6bc..49091c3 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -7,8 +7,51 @@
  */
 
 #include 
+#include 
+#include 
+#include 
 #include 
 #include 
 #include 
 
 #include "libbpf.h"
+
+#define __printf(a, b) __attribute__((format(printf, a, b)))
+
+__printf(1, 2)
+static int __base_pr(const char *format, ...)
+{
+   va_list args;
+   int err;
+
+   va_start(args, format);
+   err = vfprintf(stderr, format, args);
+   va_end(args);
+   return err;
+}
+
+static __printf(1, 2) int (*__pr_warning)(const char *format, ...) =
+   __base_pr;
+static __printf(1, 2) int (*__pr_info)(const char *format, ...) =
+   __base_pr;
+static __printf(1, 2) int (*__pr_debug)(const char *format, ...) =
+   NULL;
+
+#define __pr(func, fmt, ...)   \
+do {   \
+   if ((func)) \
+   (func)("libbpf: " fmt, ##__VA_ARGS__); \
+} while(0)
+
+#define pr_warning(fmt, ...)   __pr(__pr_warning, fmt, ##__VA_ARGS__)
+#define pr_info(fmt, ...)  __pr(__pr_info, fmt, ##__VA_ARGS__)
+#define pr_debug(fmt, ...) __pr(__pr_debug, fmt, ##__VA_ARGS__)
+
+void libbpf_set_print(int (*warn)(const char *format, ...),
+ int (*info)(const char *format, ...),
+ int (*debug)(const char *format, ...))
+{
+   __pr_warning = warn;
+   __pr_info = info;
+   __pr_debug = debug;
+}
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index a6f46d9..430b122 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -8,4 +8,8 @@
 #ifndef __BPF_LIBBPF_H
 #define __BPF_LIBBPF_H
 
+void libbpf_set_print(int (*warn)(const char *format, ...),
+ int (*info)(const char *format, ...),
+ int (*debug)(const char *format, ...));
+
 #endif
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/