Browse Source

Merge pull request #260 from grissiom/logtrace-next

Logtrace next
Bernard Xiong 11 years ago
parent
commit
279f2cb948
2 changed files with 50 additions and 13 deletions
  1. 11 10
      components/utilities/logtrace/log_trace.c
  2. 39 3
      components/utilities/logtrace/log_trace.h

+ 11 - 10
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. */
 /* 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(
-        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 ']' */
     /* 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);
 }
 }
 
 

+ 39 - 3
components/utilities/logtrace/log_trace.h

@@ -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. */