summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-03-24 21:46:47 +0000
committerGreg Clayton <gclayton@apple.com>2016-03-24 21:46:47 +0000
commit8e1232af42901b33ce9c54987cd9d86f1bdfb1b9 (patch)
tree7d684e0ec36c90648ec8d0f1db0dafed948a1c8d
parentae81c293521887284aca35059070bc688bcae771 (diff)
downloadbcm5719-llvm-8e1232af42901b33ce9c54987cd9d86f1bdfb1b9.tar.gz
bcm5719-llvm-8e1232af42901b33ce9c54987cd9d86f1bdfb1b9.zip
Get rid of a global constructor that was causing a warning on MacOSX and make the Timer safe to use after the main threads global destructor chain is called.
llvm-svn: 264346
-rw-r--r--lldb/include/lldb/Core/Timer.h1
-rw-r--r--lldb/source/Core/Timer.cpp17
2 files changed, 14 insertions, 4 deletions
diff --git a/lldb/include/lldb/Core/Timer.h b/lldb/include/lldb/Core/Timer.h
index 4996db62557..4d89700644c 100644
--- a/lldb/include/lldb/Core/Timer.h
+++ b/lldb/include/lldb/Core/Timer.h
@@ -86,7 +86,6 @@ protected:
static std::atomic<bool> g_quiet;
static std::atomic<unsigned> g_display_depth;
- static std::mutex g_file_mutex;
private:
Timer();
diff --git a/lldb/source/Core/Timer.cpp b/lldb/source/Core/Timer.cpp
index 7a6e5de75cf..73175988753 100644
--- a/lldb/source/Core/Timer.cpp
+++ b/lldb/source/Core/Timer.cpp
@@ -39,7 +39,18 @@ namespace
std::atomic<bool> Timer::g_quiet(true);
std::atomic<unsigned> Timer::g_display_depth(0);
-std::mutex Timer::g_file_mutex;
+static std::mutex &
+GetFileMutex()
+{
+ static std::mutex *g_file_mutex_ptr = nullptr;
+ static std::once_flag g_once_flag;
+ std::call_once(g_once_flag, []() {
+ // leaked on purpose to ensure this mutex works after main thread has run
+ // global C++ destructor chain
+ g_file_mutex_ptr = new std::mutex();
+ });
+ return *g_file_mutex_ptr;
+}
static Mutex &
@@ -97,7 +108,7 @@ Timer::Timer (const char *category, const char *format, ...) :
{
if (g_quiet == false)
{
- std::lock_guard<std::mutex> lock(g_file_mutex);
+ std::lock_guard<std::mutex> lock(GetFileMutex());
// Indent
::fprintf(stdout, "%*s", stack->m_depth * TIMER_INDENT_AMOUNT, "");
@@ -152,7 +163,7 @@ Timer::~Timer()
if (g_quiet == false)
{
- std::lock_guard<std::mutex> lock(g_file_mutex);
+ std::lock_guard<std::mutex> lock(GetFileMutex());
::fprintf(stdout, "%*s%.9f sec (%.9f sec)\n", (stack->m_depth - 1) * TIMER_INDENT_AMOUNT, "",
total_nsec / 1000000000.0, timer_nsec / 1000000000.0);
}
OpenPOWER on IntegriCloud