From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> The aim of this patch is to optimize codes for normal log level and not to hesitate to add a debug code even in a critical path. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- This depends on my patch "add a print function for each log level". include/compiler.h | 3 +++ include/logger.h | 14 ++++++++++++-- lib/logger.c | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/compiler.h b/include/compiler.h index df38dc8..58ea3ca 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -12,6 +12,9 @@ #ifndef SD_COMPILER_H #define SD_COMPILER_H +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + #define __packed __attribute((packed)) #define __printf(a, b) __attribute__((format(printf, a, b))) diff --git a/include/logger.h b/include/logger.h index 1589954..5bb3a65 100644 --- a/include/logger.h +++ b/include/logger.h @@ -28,6 +28,8 @@ struct logger_user_info { int port; }; +extern int sd_log_level; + void early_log_init(const char *format_name, struct logger_user_info *user_info); int log_init(const char *progname, bool to_stdout, int level, char *outfile); @@ -68,8 +70,16 @@ void sd_backtrace(void); log_write(SDOG_NOTICE, __func__, __LINE__, fmt, ##args) #define sd_info(fmt, args...) \ log_write(SDOG_INFO, __func__, __LINE__, fmt, ##args) -#define sd_debug(fmt, args...) \ - log_write(SDOG_DEBUG, __func__, __LINE__, fmt, ##args) + +/* + * 'args' must not contain an operation/function with a side-effect. It won't + * be evaluated when the log level is not SDOG_DEBUG. + */ +#define sd_debug(fmt, args...) \ +({ \ + if (unlikely(sd_log_level == SDOG_DEBUG)) \ + log_write(SDOG_DEBUG, __func__, __LINE__, fmt, ##args); \ +}) #define panic(fmt, args...) \ ({ \ diff --git a/lib/logger.c b/lib/logger.c index 97a5648..f1fefff 100644 --- a/lib/logger.c +++ b/lib/logger.c @@ -106,7 +106,7 @@ static __thread int worker_idx; static struct logarea *la; static const char *log_name; static char *log_nowname; -static int log_level = SDOG_INFO; +int sd_log_level = SDOG_INFO; static pid_t sheep_pid; static pid_t logger_pid; static key_t semkey; @@ -445,7 +445,7 @@ void log_write(int prio, const char *func, int line, const char *fmt, ...) { va_list ap; - if (prio > log_level) + if (prio > sd_log_level) return; va_start(ap, fmt); @@ -610,7 +610,7 @@ int log_init(const char *program_name, bool to_stdout, int level, char log_dir[PATH_MAX], tmp[PATH_MAX]; int size = level == SDOG_DEBUG ? LOG_SPACE_DEBUG_SIZE : LOG_SPACE_SIZE; - log_level = level; + sd_log_level = level; log_name = program_name; log_nowname = outfile; -- 1.7.9.5 |