diff --git a/components/utilities/logtrace/log_trace.c b/components/utilities/logtrace/log_trace.c index 1d0a42725e..d060465907 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,9 @@ 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 __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,12 +304,12 @@ 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); -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; @@ -321,7 +322,7 @@ void log_session(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 77e1f08b6c..1e8cc4abae 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,43 @@ 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, ...); + +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. */