diff options
Diffstat (limited to 'lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp | 65 |
1 files changed, 39 insertions, 26 deletions
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp index b0211720871..986989f690a 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp +++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp @@ -17,29 +17,38 @@ using namespace lldb; using namespace lldb_private; +// We want to avoid global constructors where code needs to be run so here we +// control access to our static g_log_sp by hiding it in a singleton function +// that will construct the static g_lob_sp the first time this function is +// called. +static LogSP & +GetLog () +{ + static LogSP g_log_sp; + return g_log_sp; +} -static Log* g_log = NULL; // Leak for now as auto_ptr was being cleaned up - // by global constructors before other threads - // were done with it. -Log * +LogSP ProcessMacOSXLog::GetLogIfAllCategoriesSet (uint32_t mask) { - Log *log = g_log; + LogSP log(GetLog ()); if (log && mask) { uint32_t log_mask = log->GetMask().Get(); if ((log_mask & mask) != mask) - return NULL; + return LogSP(); } return log; } + void ProcessMacOSXLog::DisableLog (Args &args, Stream *feedback_strm) { - if (g_log) + LogSP log (GetLog ()); + if (log) { - uint32_t flag_bits = g_log->GetMask().Get(); + uint32_t flag_bits = log->GetMask().Get(); const size_t argc = args.GetArgumentCount (); for (size_t i = 0; i < argc; ++i) { @@ -65,28 +74,32 @@ ProcessMacOSXLog::DisableLog (Args &args, Stream *feedback_strm) } } if (flag_bits == 0) - DeleteLog (); + GetLog().reset(); else - g_log->GetMask().Reset (flag_bits); + log->GetMask().Reset (flag_bits); } } -void -ProcessMacOSXLog::DeleteLog () +LogSP +ProcessMacOSXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args &args, Stream *feedback_strm) { - if (g_log) + // Try see if there already is a log - that way we can reuse its settings. + // We could reuse the log in toto, but we don't know that the stream is the same. + uint32_t flag_bits; + LogSP log(GetLog ()); + if (log) + flag_bits = log->GetMask().Get(); + else + flag_bits = 0; + + // Now make a new log with this stream if one was provided + if (log_stream_sp) { - delete g_log; - g_log = NULL; + log = make_shared<Log>(log_stream_sp); + GetLog () = log; } -} -Log * -ProcessMacOSXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args &args, Stream *feedback_strm) -{ - DeleteLog (); - g_log = new Log (log_stream_sp); - if (g_log) + if (log) { uint32_t flag_bits = 0; bool got_unknown_category = false; @@ -121,10 +134,10 @@ ProcessMacOSXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args } if (flag_bits == 0) flag_bits = PD_LOG_DEFAULT; - g_log->GetMask().Reset(flag_bits); - g_log->GetOptions().Reset(log_options); + log->GetMask().Reset(flag_bits); + log->GetOptions().Reset(log_options); } - return g_log; + return log; } void @@ -150,7 +163,7 @@ ProcessMacOSXLog::ListLogCategories (Stream *strm) void ProcessMacOSXLog::LogIf (uint32_t mask, const char *format, ...) { - Log *log = ProcessMacOSXLog::GetLogIfAllCategoriesSet (mask); + LogSP log(ProcessMacOSXLog::GetLogIfAllCategoriesSet (mask)); if (log) { va_list args; |