Skip to content

Commit

Permalink
log: add a per line log helper
Browse files Browse the repository at this point in the history
gcc builtin __builtin_strchr can be used as a static assertion to check
whether passed format strings contain a \n.
This can be useful to detect double \n in log messages.

Signed-off-by: David Marchand <[email protected]>
  • Loading branch information
david-marchand committed Dec 8, 2023
1 parent e15ba64 commit 14aba45
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
8 changes: 8 additions & 0 deletions devtools/checkpatches.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ print_usage () {
check_forbidden_additions() { # <patch>
res=0

# refrain from new calls to RTE_LOG
awk -v FOLDERS="lib" \
-v EXPRESSIONS="RTE_LOG\\\(" \
-v RET_ON_FAIL=1 \
-v MESSAGE='Prefer RTE_LOG_LINE' \
-f $(dirname $(readlink -f $0))/check-forbidden-tokens.awk \
"$1" || res=1

# refrain from new additions of rte_panic() and rte_exit()
# multiple folders and expressions are separated by spaces
awk -v FOLDERS="lib drivers" \
Expand Down
21 changes: 21 additions & 0 deletions lib/log/rte_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
extern "C" {
#endif

#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
Expand Down Expand Up @@ -358,6 +359,26 @@ int rte_vlog(uint32_t level, uint32_t logtype, const char *format, va_list ap)
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__) : \
0)

#ifdef RTE_TOOLCHAIN_GCC
#define RTE_LOG_CHECK_NO_NEWLINE(fmt) \
static_assert(!__builtin_strchr(fmt, '\n'), \
"This log format string contains a \\n")
#else
#define RTE_LOG_CHECK_NO_NEWLINE(...)
#endif

#define RTE_LOG_LINE(l, t, ...) do { \
RTE_LOG_CHECK_NO_NEWLINE(RTE_FMT_HEAD(__VA_ARGS__,)); \
RTE_LOG(l, t, RTE_FMT(RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
RTE_FMT_TAIL(__VA_ARGS__ ,))); \
} while (0)

#define RTE_LOG_DP_LINE(l, t, ...) do { \
RTE_LOG_CHECK_NO_NEWLINE(RTE_FMT_HEAD(__VA_ARGS__,)); \
RTE_LOG_DP(l, t, RTE_FMT(RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
RTE_FMT_TAIL(__VA_ARGS__ ,))); \
} while (0)

#define RTE_LOG_REGISTER_IMPL(type, name, level) \
int type; \
RTE_INIT(__##type) \
Expand Down

0 comments on commit 14aba45

Please sign in to comment.