Merge pull request #260 from grissiom/logtrace-next

Logtrace next
This commit is contained in:
Bernard Xiong 2014-04-10 21:58:06 +08:00
commit 279f2cb948
2 changed files with 50 additions and 13 deletions

View File

@ -42,7 +42,7 @@ static rt_device_t _traceout_device = RT_NULL;
/* define a default lg session. The name is empty. */ /* 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 _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 */ /* there is a default session at least */
static rt_uint16_t _the_sess_nr = 1; 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* _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; rt_uint16_t first, last;
if (_cache->id.num == num) if (_cache->id.num == num)
return _cache; return (struct log_trace_session *)_cache;
first = 0; first = 0;
last = _the_sess_nr; 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 * 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. */ * a lot because it will be flushed in the next time. */
_cache = _the_sessions[i]; _cache = _the_sessions[i];
return _the_sessions[i]; return (struct log_trace_session *)_the_sessions[i];
} }
else if (_the_sessions[i]->id.num > num) 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; 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; unsigned int lvl, i;
@ -255,8 +255,9 @@ static rt_size_t _lg_parse_session(
return 0; return 0;
} }
static void _lg_fmtout( void __logtrace_vfmtout(const struct log_trace_session *session,
struct log_trace_session *session, const char *fmt, va_list argptr) const char *fmt,
va_list argptr)
{ {
/* 1 for ']' */ /* 1 for ']' */
static char _trace_buf[1+LOG_TRACE_BUFSZ]; static char _trace_buf[1+LOG_TRACE_BUFSZ];
@ -303,12 +304,12 @@ void log_trace(const char *fmt, ...)
return; return;
va_start(args, fmt); va_start(args, fmt);
_lg_fmtout(session, fmt, args); __logtrace_vfmtout(session, fmt, args);
va_end(args); va_end(args);
} }
FINSH_FUNCTION_EXPORT(log_trace, log trace); 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; va_list args;
int level; int level;
@ -321,7 +322,7 @@ void log_session(struct log_trace_session *session, const char *fmt, ...)
return; return;
va_start(args, fmt); va_start(args, fmt);
_lg_fmtout(session, fmt, args); __logtrace_vfmtout(session, fmt, args);
va_end(args); va_end(args);
} }

View File

@ -1,7 +1,7 @@
/* /*
* File : log_trace.h * File : log_trace.h
* This file is part of RT-Thread RTOS * 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 * 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 * 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. * @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 /** 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 * "[systick][name]log messages". The name is the name of the session. It is
* faster than bare log_trace. * 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. */ /* here comes the global part. All sessions share the some output backend. */