From ae5297e6d75579bfbd13ae4ab5d8e212de1b2d37 Mon Sep 17 00:00:00 2001 From: timoore Date: Sat, 29 Nov 2008 00:17:29 +0000 Subject: [PATCH] logstream improvements from Yon Uriarte Avoid descending into iostream when a message won't be logged. --- simgear/debug/logstream.cxx | 17 +++++++++++++++-- simgear/debug/logstream.hxx | 26 ++++++++++++++++++++------ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/simgear/debug/logstream.cxx b/simgear/debug/logstream.cxx index 8f6104a8..d906679e 100644 --- a/simgear/debug/logstream.cxx +++ b/simgear/debug/logstream.cxx @@ -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; } diff --git a/simgear/debug/logstream.hxx b/simgear/debug/logstream.hxx index c79f7766..fa9dd9fc 100644 --- a/simgear/debug/logstream.hxx +++ b/simgear/debug/logstream.hxx @@ -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__) -- 2.39.5