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
|
from other threads. wxLog does however guarantee that messages logged by each
|
||||||
thread will appear in order in which they were logged.
|
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
|
// 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?
|
// 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
|
// change the flag state, return the previous one
|
||||||
static bool EnableLogging(bool doIt = true)
|
static bool EnableLogging(bool enable = true)
|
||||||
{ bool doLogOld = ms_doLog; ms_doLog = doIt; return doLogOld; }
|
{
|
||||||
|
#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
|
// return the current global log level
|
||||||
static wxLogLevel GetLogLevel() { return ms_logLevel; }
|
static wxLogLevel GetLogLevel() { return ms_logLevel; }
|
||||||
@@ -582,6 +599,11 @@ private:
|
|||||||
// called from FlushActive() to really log any buffered messages logged
|
// called from FlushActive() to really log any buffered messages logged
|
||||||
// from the other threads
|
// from the other threads
|
||||||
void FlushThreadMessages();
|
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
|
#endif // wxUSE_THREADS
|
||||||
|
|
||||||
// called from OnLog() if it's called from the main thread or if we have a
|
// 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
|
// NB: this must be a POD to be stored in TLS
|
||||||
struct wxThreadSpecificInfo
|
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;
|
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
|
// currently this is defined in src/common/log.cpp
|
||||||
|
@@ -744,7 +744,8 @@ public:
|
|||||||
/**
|
/**
|
||||||
Globally enable or disable logging.
|
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()
|
@see wxLogNull, IsEnabled()
|
||||||
|
|
||||||
@@ -845,7 +846,7 @@ public:
|
|||||||
static bool IsEnabled();
|
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
|
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
|
@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))
|
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);
|
MyImageDialog dlg(this);
|
||||||
|
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
@@ -1003,6 +1008,11 @@ wxThread::ExitCode MyWorkerThread::Entry()
|
|||||||
|
|
||||||
wxThread::ExitCode MyGUIThread::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
|
// this goes to the main window
|
||||||
wxLogMessage("GUI thread starting");
|
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
|
#endif // wxUSE_THREADS
|
||||||
|
|
||||||
void wxLog::Flush()
|
void wxLog::Flush()
|
||||||
|
Reference in New Issue
Block a user