forked from OSchip/llvm-project
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:
parent
15bc34c7c2
commit
20bd37f747
|
@ -260,6 +260,12 @@ public:
|
|||
static void
|
||||
Terminate ();
|
||||
|
||||
static void
|
||||
SettingsInitialize ();
|
||||
|
||||
static void
|
||||
SettingsTerminate ();
|
||||
|
||||
static void
|
||||
Destroy (lldb::DebuggerSP &debugger_sp);
|
||||
|
||||
|
|
|
@ -539,13 +539,10 @@ public:
|
|||
#endif
|
||||
|
||||
static void
|
||||
Initialize ();
|
||||
SettingsInitialize ();
|
||||
|
||||
static void
|
||||
DidInitialize ();
|
||||
|
||||
static void
|
||||
Terminate ();
|
||||
SettingsTerminate ();
|
||||
|
||||
static lldb::UserSettingsControllerSP &
|
||||
GetSettingsController ();
|
||||
|
|
|
@ -141,10 +141,10 @@ public:
|
|||
};
|
||||
|
||||
static void
|
||||
Initialize ();
|
||||
SettingsInitialize ();
|
||||
|
||||
static void
|
||||
Terminate ();
|
||||
SettingsTerminate ();
|
||||
|
||||
static lldb::UserSettingsControllerSP &
|
||||
GetSettingsController ();
|
||||
|
|
|
@ -194,10 +194,10 @@ public:
|
|||
UpdateInstanceName ();
|
||||
|
||||
static void
|
||||
Initialize ();
|
||||
SettingsInitialize ();
|
||||
|
||||
static void
|
||||
Terminate ();
|
||||
SettingsTerminate ();
|
||||
|
||||
static lldb::UserSettingsControllerSP &
|
||||
GetSettingsController ();
|
||||
|
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue