The UserSettings controllers must be initialized & terminated in the

correct order.  Previously this was tacitly implemented but not
enforced, so it was possible to accidentally do things in the wrong
order and cause problems.  This fixes that problem.

llvm-svn: 127430
This commit is contained in:
Caroline Tice 2011-03-10 22:14:10 +00:00
parent 15bc34c7c2
commit 20bd37f747
9 changed files with 84 additions and 37 deletions

View File

@ -260,6 +260,12 @@ public:
static void
Terminate ();
static void
SettingsInitialize ();
static void
SettingsTerminate ();
static void
Destroy (lldb::DebuggerSP &debugger_sp);

View File

@ -539,13 +539,10 @@ public:
#endif
static void
Initialize ();
SettingsInitialize ();
static void
DidInitialize ();
static void
Terminate ();
SettingsTerminate ();
static lldb::UserSettingsControllerSP &
GetSettingsController ();

View File

@ -141,10 +141,10 @@ public:
};
static void
Initialize ();
SettingsInitialize ();
static void
Terminate ();
SettingsTerminate ();
static lldb::UserSettingsControllerSP &
GetSettingsController ();

View File

@ -194,10 +194,10 @@ public:
UpdateInstanceName ();
static void
Initialize ();
SettingsInitialize ();
static void
Terminate ();
SettingsTerminate ();
static lldb::UserSettingsControllerSP &
GetSettingsController ();

View File

@ -71,11 +71,6 @@ Debugger::Initialize ()
{
if (g_shared_debugger_refcount == 0)
{
UserSettingsControllerSP &usc = GetSettingsController();
usc.reset (new SettingsController);
UserSettingsController::InitializeSettingsController (usc,
SettingsController::global_settings_table,
SettingsController::instance_settings_table);
lldb_private::Initialize();
}
g_shared_debugger_refcount++;
@ -92,9 +87,6 @@ Debugger::Terminate ()
{
lldb_private::WillTerminate();
lldb_private::Terminate();
UserSettingsControllerSP &usc = GetSettingsController();
UserSettingsController::FinalizeSettingsController (usc);
usc.reset();
// Clear our master list of debugger objects
Mutex::Locker locker (GetDebuggerListMutex ());
@ -103,6 +95,40 @@ Debugger::Terminate ()
}
}
void
Debugger::SettingsInitialize ()
{
static bool g_initialized = false;
if (!g_initialized)
{
g_initialized = true;
UserSettingsControllerSP &usc = GetSettingsController();
usc.reset (new SettingsController);
UserSettingsController::InitializeSettingsController (usc,
SettingsController::global_settings_table,
SettingsController::instance_settings_table);
// Now call SettingsInitialize for each settings 'child' of Debugger
Target::SettingsInitialize ();
}
}
void
Debugger::SettingsTerminate ()
{
// Must call SettingsTerminate() for each settings 'child' of Debugger, before terminating the Debugger's
// Settings.
Target::SettingsTerminate ();
// Now terminate the Debugger Settings.
UserSettingsControllerSP &usc = GetSettingsController();
UserSettingsController::FinalizeSettingsController (usc);
usc.reset();
}
DebuggerSP
Debugger::CreateInstance ()
{

View File

@ -2671,7 +2671,7 @@ Process::PopProcessInputReader ()
// The process needs to know about installed plug-ins
void
Process::DidInitialize ()
Process::SettingsInitialize ()
{
static std::vector<lldb::OptionEnumValueElement> g_plugins;
@ -2707,16 +2707,20 @@ Process::DidInitialize ()
UserSettingsController::InitializeSettingsController (usc,
SettingsController::global_settings_table,
SettingsController::instance_settings_table);
// Now call SettingsInitialize() for each 'child' of Process settings
Thread::SettingsInitialize ();
}
void
Process::Initialize ()
{
}
void
Process::Terminate ()
Process::SettingsTerminate ()
{
// Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings.
Thread::SettingsTerminate ();
// Now terminate Process Settings.
UserSettingsControllerSP &usc = GetSettingsController();
UserSettingsController::FinalizeSettingsController (usc);
usc.reset();

View File

@ -779,18 +779,28 @@ Target::GetScratchClangASTContext()
}
void
Target::Initialize ()
Target::SettingsInitialize ()
{
UserSettingsControllerSP &usc = GetSettingsController();
usc.reset (new SettingsController);
UserSettingsController::InitializeSettingsController (usc,
SettingsController::global_settings_table,
SettingsController::instance_settings_table);
// Now call SettingsInitialize() on each 'child' setting of Target
Process::SettingsInitialize ();
}
void
Target::Terminate ()
Target::SettingsTerminate ()
{
// Must call SettingsTerminate() on each settings 'child' of Target, before terminating Target's Settings.
Process::SettingsTerminate ();
// Now terminate Target Settings.
UserSettingsControllerSP &usc = GetSettingsController();
UserSettingsController::FinalizeSettingsController (usc);
usc.reset();

View File

@ -1006,18 +1006,26 @@ Thread::GetSP ()
void
Thread::Initialize ()
Thread::SettingsInitialize ()
{
UserSettingsControllerSP &usc = GetSettingsController();
usc.reset (new SettingsController);
UserSettingsController::InitializeSettingsController (usc,
SettingsController::global_settings_table,
SettingsController::instance_settings_table);
// Now call SettingsInitialize() on each 'child' setting of Thread.
// Currently there are none.
}
void
Thread::Terminate ()
Thread::SettingsTerminate ()
{
// Must call SettingsTerminate() on each 'child' setting of Thread before terminating Thread settings.
// Currently there are none.
// Now terminate Thread Settings.
UserSettingsControllerSP &usc = GetSettingsController();
UserSettingsController::FinalizeSettingsController (usc);
usc.reset();

View File

@ -74,9 +74,6 @@ lldb_private::Initialize ()
Timer::Initialize ();
Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
Target::Initialize ();
Process::Initialize ();
Thread::Initialize ();
DisassemblerLLVM::Initialize();
ObjectContainerBSDArchive::Initialize();
ObjectFileELF::Initialize();
@ -112,9 +109,10 @@ lldb_private::Initialize ()
// Scan for any system or user LLDB plug-ins
PluginManager::Initialize();
// The process needs to know about installed plug-ins
Process::DidInitialize ();
// The process settings need to know about installed plug-ins, so the Settings must be initialized
// AFTER PluginManager::Initialize is called.
Debugger::SettingsInitialize();
}
}
@ -157,9 +155,7 @@ lldb_private::Terminate ()
PlatformMacOSX::Terminate();
#endif
Thread::Terminate ();
Process::Terminate ();
Target::Terminate ();
Debugger::SettingsTerminate ();
#if defined (__linux__)
PlatformLinux::Terminate();