]> git.saurik.com Git - wxWidgets.git/commitdiff
Do our best to show messages logged during program startup/shutdown.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 18 Jul 2009 11:56:44 +0000 (11:56 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 18 Jul 2009 11:56:44 +0000 (11:56 +0000)
Use wxMessageOutputBest to show them even under Windows where programs usually don't have stderr at all and also don't disable log target auto-creation during shutdown as it's arguably better to leak memory (which shouldn't matter much when the program is about to exit anyhow) than to not show possibly important messages.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61450 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/init.cpp
src/common/log.cpp

index 6e9f06fad8a1dcd7b421e93e14546abd43f621c2..cac8abde3c469cd8aae4a500b3a922701ee26fb5 100644 (file)
@@ -229,13 +229,6 @@ static bool DoCommonPreInit()
 #if wxUSE_LOG
     // Reset logging in case we were cleaned up and are being reinitialized.
     wxLog::DoCreateOnDemand();
-
-    // install temporary log sink: we can't use wxLogGui before wxApp is
-    // constructed and if we use wxLogStderr, all messages during
-    // initialization simply disappear under Windows
-    //
-    // note that we will delete this log target below
-    delete wxLog::SetActiveTarget(new wxLogBuffer);
 #endif // wxUSE_LOG
 
     return true;
@@ -356,14 +349,15 @@ bool wxEntryStart(int& argc, char **argv)
 static void DoCommonPreCleanup()
 {
 #if wxUSE_LOG
-    // flush the logged messages if any and install a 'safer' log target: the
-    // default one (wxLogGui) can't be used after the resources are freed just
-    // below and the user supplied one might be even more unsafe (using any
-    // wxWidgets GUI function is unsafe starting from now)
-    wxLog::DontCreateOnDemand();
-
-    // this will flush the old messages if any
-    delete wxLog::SetActiveTarget(new wxLogStderr);
+    // flush the logged messages if any and don't use the current probably
+    // unsafe log target any more: the default one (wxLogGui) can't be used
+    // after the resources are freed which happens when we return and the user
+    // supplied one might be even more unsafe (using any wxWidgets GUI function
+    // is unsafe starting from now)
+    //
+    // notice that wxLog will still recreate a default log target if any
+    // messages are logged but that one will be safe to use until the very end
+    delete wxLog::SetActiveTarget(NULL);
 #endif // wxUSE_LOG
 }
 
@@ -384,6 +378,12 @@ static void DoCommonPostCleanup()
 
 #if wxUSE_LOG
     // and now delete the last logger as well
+    //
+    // we still don't disable log target auto-vivification even if any log
+    // objects created now will result in memory leaks because it seems better
+    // to leak memory which doesn't matter much considering the application is
+    // exiting anyhow than to not show messages which could still be logged
+    // from the user code (e.g. static dtors and such)
     delete wxLog::SetActiveTarget(NULL);
 #endif // wxUSE_LOG
 }
index e0e0c03eea68b5e2304af01349333315810f9d0f..a55bee4511fb1e4792bd3e593c08c23db4b357c6 100644 (file)
@@ -165,6 +165,25 @@ PreviousLogInfo gs_prevLog;
 // NB: all accesses to it must be protected by GetLevelsCS() critical section
 WX_DEFINE_GLOBAL_VAR(wxStringToNumHashMap, ComponentLevels);
 
+// ----------------------------------------------------------------------------
+// wxLogOutputBest: wxLog wrapper around wxMessageOutputBest
+// ----------------------------------------------------------------------------
+
+class wxLogOutputBest : public wxLog
+{
+public:
+    wxLogOutputBest() { }
+
+protected:
+    virtual void DoLogText(const wxString& msg)
+    {
+        wxMessageOutputBest().Output(msg);
+    }
+
+private:
+    wxDECLARE_NO_COPY_CLASS(wxLogOutputBest);
+};
+
 } // anonymous namespace
 
 // ============================================================================
@@ -481,7 +500,7 @@ wxLog *wxLog::GetMainThreadActiveTarget()
             if ( wxTheApp != NULL )
                 ms_pLogger = wxTheApp->GetTraits()->CreateLogTarget();
             else
-                ms_pLogger = new wxLogStderr;
+                ms_pLogger = new wxLogOutputBest;
 
             s_bInGetActiveTarget = false;