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 )
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;
}
*/
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
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 )
{
*/
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&
inline logstream&
sglog()
{
- if (logstream::global_logstream == NULL) {
- logstream::initGlobalLogstream();
- }
- return *logstream::global_logstream;
+ return *logstream::initGlobalLogstream();
}
#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__)