From aefcf999d23d5d3465cee60be8c8db96c8edd08f Mon Sep 17 00:00:00 2001 From: Johnny Chen Date: Fri, 27 Jan 2012 21:27:39 +0000 Subject: [PATCH] Add an InstanceSettings::NotifyOwnerIsShuttingDown() method so that the owner can notify InstanceSettings instances that their owner reference is no longer valid. llvm-svn: 149145 --- lldb/include/lldb/Core/UserSettingsController.h | 4 ++++ lldb/source/Core/UserSettingsController.cpp | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lldb/include/lldb/Core/UserSettingsController.h b/lldb/include/lldb/Core/UserSettingsController.h index 2e3d182d3549..878abd20dddb 100644 --- a/lldb/include/lldb/Core/UserSettingsController.h +++ b/lldb/include/lldb/Core/UserSettingsController.h @@ -399,6 +399,9 @@ public: // Begin Pure Virtual Functions + virtual void + NotifyOwnerIsShuttingDown (); + virtual void UpdateInstanceSettingsVariable (const ConstString &var_name, const char *index_value, @@ -440,6 +443,7 @@ public: protected: UserSettingsController &m_owner; + bool m_owner_is_live; ConstString m_instance_name; }; diff --git a/lldb/source/Core/UserSettingsController.cpp b/lldb/source/Core/UserSettingsController.cpp index de3a71dd59ee..cdacad020e6a 100644 --- a/lldb/source/Core/UserSettingsController.cpp +++ b/lldb/source/Core/UserSettingsController.cpp @@ -83,6 +83,10 @@ UserSettingsController::UserSettingsController (const char *level_name, UserSettingsController::~UserSettingsController () { Mutex::Locker locker (m_live_settings_mutex); + + // Notify all instance settings that their owner is shutting down, first. + for (InstanceSettingsMap::iterator pos = m_live_settings.begin(); pos != m_live_settings.end(); ++pos) + pos->second->NotifyOwnerIsShuttingDown(); m_live_settings.clear(); } @@ -2458,7 +2462,8 @@ UserSettingsController::RenameInstanceSettings (const char *old_name, const char InstanceSettings::InstanceSettings (UserSettingsController &owner, const char *instance_name, bool live_instance) : m_owner (owner), - m_instance_name (instance_name) + m_instance_name (instance_name), + m_owner_is_live (true) { if ((m_instance_name != InstanceSettings::GetDefaultName()) && (m_instance_name != InstanceSettings::InvalidName()) @@ -2468,10 +2473,16 @@ InstanceSettings::InstanceSettings (UserSettingsController &owner, const char *i InstanceSettings::~InstanceSettings () { - if (m_instance_name != InstanceSettings::GetDefaultName()) + if (m_instance_name != InstanceSettings::GetDefaultName() && m_owner_is_live) m_owner.UnregisterInstanceSettings (this); } +void +InstanceSettings::NotifyOwnerIsShuttingDown() +{ + m_owner_is_live = false; +} + const ConstString & InstanceSettings::GetDefaultName () {