From 68a8c3a26c25ab478611a7fee209a9ecc65c59ce Mon Sep 17 00:00:00 2001 From: Steffan Karger Date: Sun, 27 Mar 2016 16:18:16 +0200 Subject: [PATCH] Replace MSG_TEST() macro for static inline msg_test() Using a static inline function instead of a macro has the advantages that (1) 'flags' is not evaluated twice and (2) coverity will stop complaining that 'Macro compares unsigned to 0 (NO_EFFECT)' each time we use flags with loglevel 0 (e.g. M_FATAL or M_WARN). This has a performance impact when compiler optimizations are fully disabled ('-O0'), but should otherwise be as fast as using a macro. Signed-off-by: Steffan Karger Acked-by: Gert Doering Message-Id: <1459088296-5046-1-git-send-email-steffan@karger.me> URL: http://article.gmane.org/gmane.network.openvpn.devel/11368 Signed-off-by: Gert Doering (cherry picked from commit bbde0a766c69f573746461415c6f5cd289272fff) --- src/openvpn/error.c | 2 +- src/openvpn/error.h | 17 +++++++++++------ src/openvpn/plugin.c | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/openvpn/error.c b/src/openvpn/error.c index b47a9e5f0..6ccdeae00 100644 --- a/src/openvpn/error.c +++ b/src/openvpn/error.c @@ -217,7 +217,7 @@ void x_msg_va (const unsigned int flags, const char *format, va_list arglist) #ifndef HAVE_VARARG_MACROS /* the macro has checked this otherwise */ - if (!MSG_TEST (flags)) + if (!msg_test (flags)) return; #endif diff --git a/src/openvpn/error.h b/src/openvpn/error.h index 52ef0bd00..4024e5e50 100644 --- a/src/openvpn/error.h +++ b/src/openvpn/error.h @@ -135,26 +135,31 @@ extern int x_msg_line_num; * msg() as a macro for optimization win. */ -bool dont_mute (unsigned int flags); /* check muting filter */ +/** Check muting filter */ +bool dont_mute (unsigned int flags); -#define MSG_TEST(flags) (unlikely((((unsigned int)flags) & M_DEBUG_LEVEL) <= x_debug_level) && dont_mute (flags)) +/** Return true if flags represent an enabled, not muted log level */ +static inline bool msg_test (unsigned int flags) +{ + return ((flags & M_DEBUG_LEVEL) <= x_debug_level) && dont_mute (flags); +} /* Macro to ensure (and teach static analysis tools) we exit on fatal errors */ #define EXIT_FATAL(flags) do { if ((flags) & M_FATAL) _exit(1); } while (false) #if defined(HAVE_CPP_VARARG_MACRO_ISO) && !defined(__LCLINT__) # define HAVE_VARARG_MACROS -# define msg(flags, ...) do { if (MSG_TEST(flags)) x_msg((flags), __VA_ARGS__); EXIT_FATAL(flags); } while (false) +# define msg(flags, ...) do { if (msg_test(flags)) x_msg((flags), __VA_ARGS__); EXIT_FATAL(flags); } while (false) # ifdef ENABLE_DEBUG -# define dmsg(flags, ...) do { if (MSG_TEST(flags)) x_msg((flags), __VA_ARGS__); EXIT_FATAL(flags); } while (false) +# define dmsg(flags, ...) do { if (msg_test(flags)) x_msg((flags), __VA_ARGS__); EXIT_FATAL(flags); } while (false) # else # define dmsg(flags, ...) # endif #elif defined(HAVE_CPP_VARARG_MACRO_GCC) && !defined(__LCLINT__) # define HAVE_VARARG_MACROS -# define msg(flags, args...) do { if (MSG_TEST(flags)) x_msg((flags), args); EXIT_FATAL(flags); } while (false) +# define msg(flags, args...) do { if (msg_test(flags)) x_msg((flags), args); EXIT_FATAL(flags); } while (false) # ifdef ENABLE_DEBUG -# define dmsg(flags, args...) do { if (MSG_TEST(flags)) x_msg((flags), args); EXIT_FATAL(flags); } while (false) +# define dmsg(flags, args...) do { if (msg_test(flags)) x_msg((flags), args); EXIT_FATAL(flags); } while (false) # else # define dmsg(flags, args...) # endif diff --git a/src/openvpn/plugin.c b/src/openvpn/plugin.c index 54c5b52d6..4e5e6ce14 100644 --- a/src/openvpn/plugin.c +++ b/src/openvpn/plugin.c @@ -316,7 +316,7 @@ plugin_vlog (openvpn_plugin_log_flags_t flags, const char *name, const char *for if (flags & PLOG_NOMUTE) msg_flags |= M_NOMUTE; - if (MSG_TEST (msg_flags)) + if (msg_test (msg_flags)) { struct gc_arena gc; char* msg_fmt; -- 2.47.2