chiark / gitweb /
log: avoid calling the logging functions for log levels above the current maximum
authorKay Sievers <kay@vrfy.org>
Sun, 20 Oct 2013 19:17:55 +0000 (21:17 +0200)
committerKay Sievers <kay@vrfy.org>
Sun, 20 Oct 2013 19:26:47 +0000 (21:26 +0200)
Messages with log levels above the current maximum log level will be dropped
inside log_meta(). But to be able to call the function, all parameters for
the function need to be provided. This can easily get expensive, if values
need to be calculated or functions are used in parameters.

Avoid all useless work by checking inside the macro, before we look
at any parameters passed to the logging functions.

src/shared/log.h

index 9ce99ef9fa4c157ccf3ebf1044676ae584080144..ac20a985c5eec1248337de09ef21dcc68819e61a 100644 (file)
@@ -136,13 +136,17 @@ _noreturn_ void log_assert_failed_unreachable(
                 int line,
                 const char *func);
 
-#define log_full(level, ...) log_meta(level,   __FILE__, __LINE__, __func__, __VA_ARGS__)
-
-#define log_debug(...)   log_meta(LOG_DEBUG,   __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define log_info(...)    log_meta(LOG_INFO,    __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define log_notice(...)  log_meta(LOG_NOTICE,  __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define log_warning(...) log_meta(LOG_WARNING, __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define log_error(...)   log_meta(LOG_ERR,     __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define log_full(level, ...) \
+do { \
+        if (log_get_max_level() >= (level)) \
+                log_meta(LOG_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__); \
+} while (0)
+
+#define log_debug(...)   log_full(LOG_DEBUG,   __VA_ARGS__)
+#define log_info(...)    log_full(LOG_INFO,    __VA_ARGS__)
+#define log_notice(...)  log_full(LOG_NOTICE,  __VA_ARGS__)
+#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__)
+#define log_error(...)   log_full(LOG_ERR,     __VA_ARGS__)
 
 #define log_struct(level, ...) log_struct_internal(level, __FILE__, __LINE__, __func__, __VA_ARGS__)