]> git.mxchange.org Git - simgear.git/commitdiff
logstream improvements from Yon Uriarte
authortimoore <timoore>
Sat, 29 Nov 2008 00:17:29 +0000 (00:17 +0000)
committertimoore <timoore>
Sat, 29 Nov 2008 00:17:29 +0000 (00:17 +0000)
Avoid descending into iostream when a message won't be logged.

simgear/debug/logstream.cxx
simgear/debug/logstream.hxx

index 8f6104a8d2780157b893948f69e4c8d1958c44be..d906679e88ae1efa19194094ce6a146e539f0b6f 100644 (file)
@@ -34,6 +34,17 @@ sgDebugClass    logbuf::logClass        = SG_NONE;
 sgDebugPriority logbuf::logPriority     = SG_INFO;
 streambuf*      logbuf::sbuf            = NULL;
 
+namespace {
+struct ignore_me
+{
+    ignore_me()
+    {
+        logstream::initGlobalLogstream();
+    }
+};
+static ignore_me im;
+}
+
 logbuf::logbuf()
 {
 //     if ( sbuf == NULL )
@@ -92,10 +103,12 @@ logstream::setLogLevels( sgDebugClass c, sgDebugPriority p )
     logbuf::set_log_level( c, p );
 }
 
-void
+logstream *
 logstream::initGlobalLogstream()
 {
     // Force initialization of cerr.
     static std::ios_base::Init initializer;
-    global_logstream = new logstream(std::cerr);
+    if( !global_logstream )
+        global_logstream = new logstream(std::cerr);
+    return global_logstream;
 }
index c79f7766f805d3e3388a0e8c7dea038ae389ce95..fa9dd9fcf4aa4674706bc8f406f046a1eec82c4c 100644 (file)
@@ -78,6 +78,8 @@ public:
      */
     void set_log_state( sgDebugClass c, sgDebugPriority p );
 
+    bool would_log( sgDebugClass c, sgDebugPriority p ) const;
+
     /**
      * Set the global logging level.
      * @param c debug class
@@ -164,6 +166,12 @@ logbuf::set_log_state( sgDebugClass c, sgDebugPriority p )
     logging_enabled = ((c & logClass) != 0 && p >= logPriority);
 }
 
+inline bool
+logbuf::would_log( sgDebugClass c, sgDebugPriority p ) const
+{
+    return ((c & logClass) != 0 && p >= logPriority);
+}
+
 inline logbuf::int_type
 logbuf::overflow( int c )
 {
@@ -240,15 +248,20 @@ public:
      */
     void setLogLevels( sgDebugClass c, sgDebugPriority p );
 
+    bool would_log(  sgDebugClass c, sgDebugPriority p ) const
+    {
+        return lbuf.would_log( c, p );
+    };
+
     /**
      * Output operator to capture the debug level and priority of a message.
      * @param l log level
      */
     inline std::ostream& operator<< ( const loglevel& l );
     friend logstream& sglog();
+    static logstream *initGlobalLogstream();
 protected:
     static logstream *global_logstream;
-    static void initGlobalLogstream();
 };
 
 inline std::ostream&
@@ -268,10 +281,7 @@ logstream::operator<< ( const loglevel& l )
 inline logstream&
 sglog()
 {
-  if (logstream::global_logstream == NULL) {
-      logstream::initGlobalLogstream();
-  }
-  return *logstream::global_logstream;
+    return *logstream::initGlobalLogstream();
 }
 
 
@@ -284,7 +294,11 @@ sglog()
 #ifdef FG_NDEBUG
 # define SG_LOG(C,P,M)
 #else
-# define SG_LOG(C,P,M) sglog() << loglevel(C,P) << M << std::endl
+# define SG_LOG(C,P,M) do {                     \
+       logstream& __tmplogstreamref(sglog());                      \
+       if(__tmplogstreamref.would_log(C,P)) {                      \
+        __tmplogstreamref << loglevel(C,P) << M << std::endl; } \
+       } while(0)
 #endif
 
 #define SG_ORIGIN __FILE__ ":" SG_STRINGIZE(__LINE__)