summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-02-26 23:20:08 +0000
committerGreg Clayton <gclayton@apple.com>2016-02-26 23:20:08 +0000
commitcc2e27f098b0515a7f4d2478c7bebe30169a49d6 (patch)
treeeb6d2b94c71d12387f3f45afc9a863947a7cb6d9
parent0c95decaaa8d82e8b85e46b81215b0131dfa6f8a (diff)
downloadbcm5719-llvm-cc2e27f098b0515a7f4d2478c7bebe30169a49d6.tar.gz
bcm5719-llvm-cc2e27f098b0515a7f4d2478c7bebe30169a49d6.zip
Make LLDB safer to use with respect to the global destructor chain.
llvm-svn: 262090
-rw-r--r--lldb/source/Target/Process.cpp9
-rw-r--r--lldb/source/Target/Target.cpp9
-rw-r--r--lldb/source/Target/Thread.cpp9
3 files changed, 15 insertions, 12 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 29a16b599bc..8340c4055c1 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -833,13 +833,14 @@ Process::~Process()
const ProcessPropertiesSP &
Process::GetGlobalProperties()
{
- static ProcessPropertiesSP g_settings_sp;
+ // NOTE: intentional leak so we don't crash if global destructor chain gets
+ // called as other threads still use the result of this function
+ static ProcessPropertiesSP *g_settings_sp_ptr = nullptr;
static std::once_flag g_once_flag;
std::call_once(g_once_flag, []() {
- if (!g_settings_sp)
- g_settings_sp.reset (new ProcessProperties (NULL));
+ g_settings_sp_ptr = new ProcessPropertiesSP(new ProcessProperties (NULL));
});
- return g_settings_sp;
+ return *g_settings_sp_ptr;
}
void
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 9719457ff41..9ba667690c8 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -2778,13 +2778,14 @@ Target::RunStopHooks ()
const TargetPropertiesSP &
Target::GetGlobalProperties()
{
- static TargetPropertiesSP g_settings_sp;
+ // NOTE: intentional leak so we don't crash if global destructor chain gets
+ // called as other threads still use the result of this function
+ static TargetPropertiesSP *g_settings_sp_ptr = nullptr;
static std::once_flag g_once_flag;
std::call_once(g_once_flag, []() {
- if (!g_settings_sp)
- g_settings_sp.reset(new TargetProperties(nullptr));
+ g_settings_sp_ptr = new TargetPropertiesSP(new TargetProperties(nullptr));
});
- return g_settings_sp;
+ return *g_settings_sp_ptr;
}
Error
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index 5534ab4f349..fd3df8f4eb1 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -59,13 +59,14 @@ using namespace lldb_private;
const ThreadPropertiesSP &
Thread::GetGlobalProperties()
{
- static ThreadPropertiesSP g_settings_sp;
+ // NOTE: intentional leak so we don't crash if global destructor chain gets
+ // called as other threads still use the result of this function
+ static ThreadPropertiesSP *g_settings_sp_ptr = nullptr;
static std::once_flag g_once_flag;
std::call_once(g_once_flag, []() {
- if (!g_settings_sp)
- g_settings_sp.reset (new ThreadProperties (true));
+ g_settings_sp_ptr = new ThreadPropertiesSP(new ThreadProperties (true));
});
- return g_settings_sp;
+ return *g_settings_sp_ptr;
}
static PropertyDefinition
OpenPOWER on IntegriCloud