summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp')
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSXLog.cpp65
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;
OpenPOWER on IntegriCloud