[PATCHv2,3/3] gdb/tui: don't leak the known_window_types map

Message ID 39fcef41919b141f6f1cd48d6a4b6f4d3b22ded3.1674654912.git.aburgess@redhat.com
State New
Headers
Series Python/TUI Window Creation / Destruction Fixes |

Commit Message

Andrew Burgess Jan. 25, 2023, 1:56 p.m. UTC
  This commit finishes the task that was started in the previous
commit.

Now that all Python TUI window factories are correctly deleted when
the Python interpreter is shut down, we no longer need to dynamically
allocate the known_window_types map in tui-layout.c

This commit changes known_window_types to a statically allocated data
structure, removes the dynamic allocation from
initialize_known_windows, and then replaces lots of '->' with '.'
throughout this file.

There should be no user visible changes after this commit.
---
 gdb/tui/tui-layout.c | 37 +++++++++++++++----------------------
 1 file changed, 15 insertions(+), 22 deletions(-)
  

Patch

diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index b895e00a80d..b65314ec30b 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -344,14 +344,9 @@  make_standard_window (const char *)
   return tui_win_list[V];
 }
 
-/* A map holding all the known window types, keyed by name.  Note that
-   this is heap-allocated and "leaked" at gdb exit.  This avoids
-   ordering issues with destroying elements in the map at shutdown.
-   In particular, destroying this map can occur after Python has been
-   shut down, causing crashes if any window destruction requires
-   running Python code.  */
+/* A map holding all the known window types, keyed by name.  */
 
-static std::unordered_map<std::string, window_factory> *known_window_types;
+static std::unordered_map<std::string, window_factory> known_window_types;
 
 /* Helper function that returns a TUI window, given its name.  */
 
@@ -362,8 +357,8 @@  tui_get_window_by_name (const std::string &name)
     if (name == window->name ())
       return window;
 
-  auto iter = known_window_types->find (name);
-  if (iter == known_window_types->end ())
+  auto iter = known_window_types.find (name);
+  if (iter == known_window_types.end ())
     error (_("Unknown window type \"%s\""), name.c_str ());
 
   tui_win_info *result = iter->second (name.c_str ());
@@ -377,20 +372,18 @@  tui_get_window_by_name (const std::string &name)
 static void
 initialize_known_windows ()
 {
-  known_window_types = new std::unordered_map<std::string, window_factory>;
-
-  known_window_types->emplace (SRC_NAME,
+  known_window_types.emplace (SRC_NAME,
 			       make_standard_window<SRC_WIN,
 						    tui_source_window>);
-  known_window_types->emplace (CMD_NAME,
+  known_window_types.emplace (CMD_NAME,
 			       make_standard_window<CMD_WIN, tui_cmd_window>);
-  known_window_types->emplace (DATA_NAME,
+  known_window_types.emplace (DATA_NAME,
 			       make_standard_window<DATA_WIN,
 						    tui_data_window>);
-  known_window_types->emplace (DISASSEM_NAME,
+  known_window_types.emplace (DISASSEM_NAME,
 			       make_standard_window<DISASSEM_WIN,
 						    tui_disasm_window>);
-  known_window_types->emplace (STATUS_NAME,
+  known_window_types.emplace (STATUS_NAME,
 			       make_standard_window<STATUS_WIN,
 						    tui_locator_window>);
 }
@@ -422,11 +415,11 @@  tui_register_window (const char *name, window_factory &&factory)
      this far then NAME must be a user defined window.  Remove any existing
      factory and replace it with this new version.  */
 
-  auto iter = known_window_types->find (name);
-  if (iter != known_window_types->end ())
-    known_window_types->erase (iter);
+  auto iter = known_window_types.find (name);
+  if (iter != known_window_types.end ())
+    known_window_types.erase (iter);
 
-  known_window_types->emplace (std::move (name_copy),
+  known_window_types.emplace (std::move (name_copy),
 			       std::move (factory));
 }
 
@@ -1207,8 +1200,8 @@  initialize_layouts ()
 static bool
 validate_window_name (const std::string &name)
 {
-  auto iter = known_window_types->find (name);
-  return iter != known_window_types->end ();
+  auto iter = known_window_types.find (name);
+  return iter != known_window_types.end ();
 }
 
 /* Implementation of the "tui new-layout" command.  */