From be0b1bb994cbe869a937450114fa36cce9f44017 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 10 May 2002 21:33:12 +0000 Subject: [PATCH] Mac OS X fixes from Jonathan Polley. --- simgear/debug/logstream.cxx | 2 ++ simgear/debug/logstream.hxx | 19 +++++++++++++++++-- simgear/debug/logtest.cxx | 28 ++++++++++++++++++++++------ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/simgear/debug/logstream.cxx b/simgear/debug/logstream.cxx index deca6993..c47d4c8b 100644 --- a/simgear/debug/logstream.cxx +++ b/simgear/debug/logstream.cxx @@ -23,6 +23,8 @@ #include "logstream.hxx" +logstream *global_logstream = NULL; + bool logbuf::logging_enabled = true; sgDebugClass logbuf::logClass = SG_NONE; sgDebugPriority logbuf::logPriority = SG_INFO; diff --git a/simgear/debug/logstream.hxx b/simgear/debug/logstream.hxx index 5b57d50f..ea35ee95 100644 --- a/simgear/debug/logstream.hxx +++ b/simgear/debug/logstream.hxx @@ -256,6 +256,7 @@ logstream::operator<< ( const loglevel& l ) return *this; } +extern logstream *global_logstream; /** * \relates logstream @@ -267,8 +268,22 @@ logstream::operator<< ( const loglevel& l ) inline logstream& sglog() { - static logstream logstrm( cerr ); - return logstrm; + if (global_logstream == NULL) { + +#ifdef __APPLE__ + /** + * There appears to be a bug in the C++ runtime in Mac OS X that + * will crash if certain funtions are called (in this case + * cerr.rdbuf()) during static initialization of a class. This + * print statement is hack to kick the library in the pants so it + * won't crash when cerr.rdbuf() is first called -DW + **/ + cout << "Using Mac OS X hack for initializing C++ stdio..." << endl; +#endif + global_logstream = new logstream (cerr); + } + + return *global_logstream; } diff --git a/simgear/debug/logtest.cxx b/simgear/debug/logtest.cxx index bf923e7a..afa5ddcc 100644 --- a/simgear/debug/logtest.cxx +++ b/simgear/debug/logtest.cxx @@ -1,16 +1,32 @@ #include #include "Debug/logstream.hxx" +class Test { + + public: + Test() { + //cout << "Cout seems to work" << endl; + //cerr << "Cerr seems to work" << endl; + + sglog().setLogLevels( SG_ALL, SG_INFO ); + + SG_LOG(SG_EVENT, SG_INFO, "Test::Test" << "foo"); + } + +}; + +Test test; + int main( int argc, char* argv[] ) { - fglog().setLogLevels( SG_ALL, SG_INFO ); + sglog().setLogLevels( SG_ALL, SG_INFO ); - SG_LOG( FG_TERRAIN, FG_BULK, "terrain::bulk" ); // shouldnt appear - SG_LOG( FG_TERRAIN, SG_DEBUG, "terrain::debug" ); // shouldnt appear - SG_LOG( FG_TERRAIN, SG_INFO, "terrain::info" ); - SG_LOG( FG_TERRAIN, FG_WARN, "terrain::warn" ); - SG_LOG( FG_TERRAIN, SG_ALERT, "terrain::alert" ); + //SG_LOG( FG_TERRAIN, FG_BULK, "terrain::bulk" ); // shouldnt appear + //SG_LOG( FG_TERRAIN, SG_DEBUG, "terrain::debug" ); // shouldnt appear + //SG_LOG( FG_TERRAIN, SG_INFO, "terrain::info" ); + //SG_LOG( FG_TERRAIN, FG_WARN, "terrain::warn" ); + //SG_LOG( FG_TERRAIN, SG_ALERT, "terrain::alert" ); int i = 12345; long l = 54321L; -- 2.39.5