Author: gclayton Date: Fri Feb 26 17:20:08 2016 New Revision: 262090 URL: http://llvm.org/viewvc/llvm-project?rev=262090&view=rev Log: Make LLDB safer to use with respect to the global destructor chain.
Modified: lldb/trunk/source/Target/Process.cpp lldb/trunk/source/Target/Target.cpp lldb/trunk/source/Target/Thread.cpp Modified: lldb/trunk/source/Target/Process.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=262090&r1=262089&r2=262090&view=diff ============================================================================== --- lldb/trunk/source/Target/Process.cpp (original) +++ lldb/trunk/source/Target/Process.cpp Fri Feb 26 17:20:08 2016 @@ -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 Modified: lldb/trunk/source/Target/Target.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=262090&r1=262089&r2=262090&view=diff ============================================================================== --- lldb/trunk/source/Target/Target.cpp (original) +++ lldb/trunk/source/Target/Target.cpp Fri Feb 26 17:20:08 2016 @@ -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 Modified: lldb/trunk/source/Target/Thread.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=262090&r1=262089&r2=262090&view=diff ============================================================================== --- lldb/trunk/source/Target/Thread.cpp (original) +++ lldb/trunk/source/Target/Thread.cpp Fri Feb 26 17:20:08 2016 @@ -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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits