Make wxLog::EnableLogging() and wxLogNull thread-specific.
Disabling logging in a single thread (even the main one) shouldn't disable logs from the background threads which should disable their logging themselves as/if needed. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61423 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		| @@ -273,5 +273,9 @@ with later timestamp may appear before messages with earlier timestamp logged | ||||
| from other threads. wxLog does however guarantee that messages logged by each | ||||
| thread will appear in order in which they were logged. | ||||
|  | ||||
| Also notice that wxLog::EnableLogging() and wxLogNull class which uses it only | ||||
| affect the current thread, i.e. logging messages may still be generated by the | ||||
| other threads after a call to @c EnableLogging(false). | ||||
|  | ||||
| */ | ||||
|  | ||||
|   | ||||
| @@ -328,15 +328,32 @@ public: | ||||
|     // ---------------------- | ||||
|  | ||||
|     // these functions allow to completely disable all log messages or disable | ||||
|     // log messages at level less important than specified | ||||
|     // log messages at level less important than specified for the current | ||||
|     // thread | ||||
|  | ||||
|     // is logging enabled at all now? | ||||
|     static bool IsEnabled() { return ms_doLog; } | ||||
|     static bool IsEnabled() | ||||
|     { | ||||
| #if wxUSE_THREADS | ||||
|         if ( !wxThread::IsMain() ) | ||||
|             return IsThreadLoggingEnabled(); | ||||
| #endif // wxUSE_THREADS | ||||
|  | ||||
|         return ms_doLog; | ||||
|     } | ||||
|  | ||||
|     // change the flag state, return the previous one | ||||
|     static bool EnableLogging(bool doIt = true) | ||||
|         { bool doLogOld = ms_doLog; ms_doLog = doIt; return doLogOld; } | ||||
|     static bool EnableLogging(bool enable = true) | ||||
|     { | ||||
| #if wxUSE_THREADS | ||||
|         if ( !wxThread::IsMain() ) | ||||
|             return EnableThreadLogging(enable); | ||||
| #endif // wxUSE_THREADS | ||||
|  | ||||
|         bool doLogOld = ms_doLog; | ||||
|         ms_doLog = enable; | ||||
|         return doLogOld; | ||||
|     } | ||||
|  | ||||
|     // return the current global log level | ||||
|     static wxLogLevel GetLogLevel() { return ms_logLevel; } | ||||
| @@ -582,6 +599,11 @@ private: | ||||
|     // called from FlushActive() to really log any buffered messages logged | ||||
|     // from the other threads | ||||
|     void FlushThreadMessages(); | ||||
|  | ||||
|     // these functions are called for non-main thread only by IsEnabled() and | ||||
|     // EnableLogging() respectively | ||||
|     static bool IsThreadLoggingEnabled(); | ||||
|     static bool EnableThreadLogging(bool enable = true); | ||||
| #endif // wxUSE_THREADS | ||||
|  | ||||
|     // called from OnLog() if it's called from the main thread or if we have a | ||||
|   | ||||
| @@ -30,7 +30,18 @@ class WXDLLIMPEXP_FWD_BASE wxLog; | ||||
| // NB: this must be a POD to be stored in TLS | ||||
| struct wxThreadSpecificInfo | ||||
| { | ||||
|     // the thread-specific logger or NULL if the thread is using the global one | ||||
|     // (this is not used for the main thread which always uses the global | ||||
|     // logger) | ||||
|     wxLog *logger; | ||||
|  | ||||
|     // true if logging is currently disabled for this thread (this is also not | ||||
|     // used for the main thread which uses wxLog::ms_doLog) | ||||
|     // | ||||
|     // NB: we use a counter-intuitive "disabled" flag instead of "enabled" one | ||||
|     //     because the default, for 0-initialized struct, should be to enable | ||||
|     //     logging | ||||
|     bool loggingDisabled; | ||||
| }; | ||||
|  | ||||
| // currently this is defined in src/common/log.cpp | ||||
|   | ||||
| @@ -744,7 +744,8 @@ public: | ||||
|     /** | ||||
|         Globally enable or disable logging. | ||||
|  | ||||
|         Calling this function with @false argument disables all log messages. | ||||
|         Calling this function with @false argument disables all log messages | ||||
|         for the current thread. | ||||
|  | ||||
|         @see wxLogNull, IsEnabled() | ||||
|  | ||||
| @@ -845,7 +846,7 @@ public: | ||||
|     static bool IsEnabled(); | ||||
|  | ||||
|     /** | ||||
|         Returns true if logging at this level is enabled. | ||||
|         Returns true if logging at this level is enabled for the current thread. | ||||
|  | ||||
|         This function only returns @true if logging is globally enabled and if | ||||
|         @a level is less than or equal to the maximal log level enabled for the | ||||
|   | ||||
| @@ -793,6 +793,11 @@ void MyFrame::OnWorkerEvent(wxThreadEvent& event) | ||||
|  | ||||
| void MyFrame::OnStartGUIThread(wxCommandEvent& WXUNUSED(event)) | ||||
| { | ||||
|     // we use this to check that disabling logging only affects the main thread | ||||
|     // but the messages from the worker thread will still be logged | ||||
|     wxLogNull noLog; | ||||
|     wxLogMessage("You shouldn't see this message because of wxLogNull"); | ||||
|  | ||||
|     MyImageDialog dlg(this); | ||||
|  | ||||
|     dlg.ShowModal(); | ||||
| @@ -1003,6 +1008,11 @@ wxThread::ExitCode MyWorkerThread::Entry() | ||||
|  | ||||
| wxThread::ExitCode MyGUIThread::Entry() | ||||
| { | ||||
|     // uncomment this to check that disabling logging here does disable it for | ||||
|     // this thread -- but not the main one if you also comment out wxLogNull | ||||
|     // line in MyFrame::OnStartGUIThread() | ||||
|     //wxLogNull noLog; | ||||
|  | ||||
|     // this goes to the main window | ||||
|     wxLogMessage("GUI thread starting"); | ||||
|  | ||||
|   | ||||
| @@ -657,6 +657,20 @@ void wxLog::FlushThreadMessages() | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* static */ | ||||
| bool wxLog::IsThreadLoggingEnabled() | ||||
| { | ||||
|     return !wxThreadInfo.loggingDisabled; | ||||
| } | ||||
|  | ||||
| /* static */ | ||||
| bool wxLog::EnableThreadLogging(bool enable) | ||||
| { | ||||
|     const bool wasEnabled = !wxThreadInfo.loggingDisabled; | ||||
|     wxThreadInfo.loggingDisabled = !enable; | ||||
|     return wasEnabled; | ||||
| } | ||||
|  | ||||
| #endif // wxUSE_THREADS | ||||
|  | ||||
| void wxLog::Flush() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user