From 12728bcdff4c983215c6ac26f1bbdd2e9512f64b Mon Sep 17 00:00:00 2001 From: Grissiom Date: Thu, 10 Apr 2014 21:10:27 +0800 Subject: [PATCH 1/2] logtrace: add const modifier to the APIs Compiler may do more optimization when the parameter is const. --- components/utilities/logtrace/log_trace.c | 16 ++++++++-------- components/utilities/logtrace/log_trace.h | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/utilities/logtrace/log_trace.c b/components/utilities/logtrace/log_trace.c index 1d0a42725..fa9cb8d34 100644 --- a/components/utilities/logtrace/log_trace.c +++ b/components/utilities/logtrace/log_trace.c @@ -42,7 +42,7 @@ static rt_device_t _traceout_device = RT_NULL; /* define a default lg session. The name is empty. */ static struct log_trace_session _def_session = {{"\0"}, LOG_TRACE_LEVEL_INFO}; -static struct log_trace_session *_the_sessions[LOG_TRACE_MAX_SESSION] = {&_def_session}; +static const struct log_trace_session *_the_sessions[LOG_TRACE_MAX_SESSION] = {&_def_session}; /* there is a default session at least */ static rt_uint16_t _the_sess_nr = 1; @@ -83,11 +83,11 @@ rt_inline int _idname_len(log_trace_idnum_t id) */ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) { - static struct log_trace_session *_cache = &_def_session; + static const struct log_trace_session *_cache = &_def_session; rt_uint16_t first, last; if (_cache->id.num == num) - return _cache; + return (struct log_trace_session *)_cache; first = 0; last = _the_sess_nr; @@ -104,7 +104,7 @@ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) * process and we wrote the old one to _cache. But it doesn't harm * a lot because it will be flushed in the next time. */ _cache = _the_sessions[i]; - return _the_sessions[i]; + return (struct log_trace_session *)_the_sessions[i]; } else if (_the_sessions[i]->id.num > num) { @@ -119,7 +119,7 @@ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) return RT_NULL; } -rt_err_t log_trace_register_session(struct log_trace_session *session) +rt_err_t log_trace_register_session(const struct log_trace_session *session) { unsigned int lvl, i; @@ -255,8 +255,8 @@ static rt_size_t _lg_parse_session( return 0; } -static void _lg_fmtout( - struct log_trace_session *session, const char *fmt, va_list argptr) +void _lg_fmtout( + const struct log_trace_session *session, const char *fmt, va_list argptr) { /* 1 for ']' */ static char _trace_buf[1+LOG_TRACE_BUFSZ]; @@ -308,7 +308,7 @@ void log_trace(const char *fmt, ...) } FINSH_FUNCTION_EXPORT(log_trace, log trace); -void log_session(struct log_trace_session *session, const char *fmt, ...) +void log_session(const struct log_trace_session *session, const char *fmt, ...) { va_list args; int level; diff --git a/components/utilities/logtrace/log_trace.h b/components/utilities/logtrace/log_trace.h index 77e1f08b6..04f89ac84 100644 --- a/components/utilities/logtrace/log_trace.h +++ b/components/utilities/logtrace/log_trace.h @@ -1,7 +1,7 @@ /* * File : log_trace.h * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2013, RT-Thread Development Team + * COPYRIGHT (C) 2013-2014, RT-Thread Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -95,7 +95,7 @@ void log_trace_init(void); * * @return RT_EOK on success. -RT_EFULL if there is no space for registration. */ -rt_err_t log_trace_register_session(struct log_trace_session *session); +rt_err_t log_trace_register_session(const struct log_trace_session *session); /** find a session with name * @@ -130,7 +130,7 @@ void log_trace(const char *fmt, ...); * "[systick][name]log messages". The name is the name of the session. It is * faster than bare log_trace. */ -void log_session(struct log_trace_session *session, const char *fmt, ...); +void log_session(const struct log_trace_session *session, const char *fmt, ...); /* here comes the global part. All sessions share the some output backend. */ From 299cccfb2655423de544db00ed09485df212b3c7 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Thu, 10 Apr 2014 21:18:38 +0800 Subject: [PATCH 2/2] logtrace: add log_session_lvl log_session_lvl is suitable for performance critical places where in most cases, the log is turned off by level. If the session is const and the level is greater than session->lvl, the whole function will be optimized out. --- components/utilities/logtrace/log_trace.c | 9 +++--- components/utilities/logtrace/log_trace.h | 36 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/components/utilities/logtrace/log_trace.c b/components/utilities/logtrace/log_trace.c index fa9cb8d34..d06046590 100644 --- a/components/utilities/logtrace/log_trace.c +++ b/components/utilities/logtrace/log_trace.c @@ -255,8 +255,9 @@ static rt_size_t _lg_parse_session( return 0; } -void _lg_fmtout( - const struct log_trace_session *session, const char *fmt, va_list argptr) +void __logtrace_vfmtout(const struct log_trace_session *session, + const char *fmt, + va_list argptr) { /* 1 for ']' */ static char _trace_buf[1+LOG_TRACE_BUFSZ]; @@ -303,7 +304,7 @@ void log_trace(const char *fmt, ...) return; va_start(args, fmt); - _lg_fmtout(session, fmt, args); + __logtrace_vfmtout(session, fmt, args); va_end(args); } FINSH_FUNCTION_EXPORT(log_trace, log trace); @@ -321,7 +322,7 @@ void log_session(const struct log_trace_session *session, const char *fmt, ...) return; va_start(args, fmt); - _lg_fmtout(session, fmt, args); + __logtrace_vfmtout(session, fmt, args); va_end(args); } diff --git a/components/utilities/logtrace/log_trace.h b/components/utilities/logtrace/log_trace.h index 04f89ac84..1e8cc4aba 100644 --- a/components/utilities/logtrace/log_trace.h +++ b/components/utilities/logtrace/log_trace.h @@ -132,6 +132,42 @@ void log_trace(const char *fmt, ...); */ void log_session(const struct log_trace_session *session, const char *fmt, ...); +extern void __logtrace_vfmtout(const struct log_trace_session *session, + const char *fmt, + va_list argptr); + +rt_inline void __logtrace_fmtout(const struct log_trace_session *session, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + __logtrace_vfmtout(session, fmt, args); + va_end(args); +} + +/** + * log with numeric level + * + * The prototype of this function is: + * + * void log_session_lvl(struct log_trace_session *session, + * int lvl, + * const char *fmt, ...); + * + * If the @session is const and @level is greater than @session->lvl, the whole + * function will be optimized out. This is suitable for performance critical + * places where in most cases, the log is turned off by level. + */ +#define log_session_lvl(session, level, fmt, ...) \ + do { \ + if ((level) > (session)->lvl) \ + { \ + break; \ + } \ + __logtrace_fmtout(session, fmt, ##__VA_ARGS__); \ + } while (0) + /* here comes the global part. All sessions share the some output backend. */ /** get the backend device */