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
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 28f589f..0718a2d 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -71,11 +71,6 @@
 {
     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 @@
         {
             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 @@
     }
 }
 
+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 ()
 {