Remove free_splay_tree cleanup
authorTom Tromey <tom@tromey.com>
Sun, 8 Oct 2017 22:37:46 +0000 (16:37 -0600)
committerTom Tromey <tom@tromey.com>
Mon, 9 Oct 2017 23:39:29 +0000 (17:39 -0600)
One spot in gdb uses a cleanup to free a splay tree.  This patch
introduces a unique_ptr specialization for this case.

ChangeLog
2017-10-09  Tom Tromey  <tom@tromey.com>

* mi/mi-main.c (free_splay_tree): Remove.
(list_available_thread_groups): Use splay_tree_up.
* common/gdb_splay_tree.h: New file.

gdb/ChangeLog
gdb/common/gdb_splay_tree.h [new file with mode: 0644]
gdb/mi/mi-main.c

index ce21e258730fe3d98f82598bd181522dca82a063..bc6cad3003e91aa392c827759484d22d6ca6e938 100644 (file)
@@ -1,3 +1,9 @@
+2017-10-09  Tom Tromey  <tom@tromey.com>
+
+       * mi/mi-main.c (free_splay_tree): Remove.
+       (list_available_thread_groups): Use splay_tree_up.
+       * common/gdb_splay_tree.h: New file.
+
 2017-10-09  Tom Tromey  <tom@tromey.com>
 
        * mi/mi-main.c (do_nothing): Remove.
diff --git a/gdb/common/gdb_splay_tree.h b/gdb/common/gdb_splay_tree.h
new file mode 100644 (file)
index 0000000..1a6577b
--- /dev/null
@@ -0,0 +1,42 @@
+/* GDB wrapper for splay trees.
+
+   Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef GDB_SPLAY_TREE_H
+#define GDB_SPLAY_TREE_H
+
+#include "splay-tree.h"
+
+namespace gdb {
+
+struct splay_tree_deleter
+{
+  void operator() (splay_tree tree) const
+  {
+    splay_tree_delete (tree);
+  }
+};
+
+} /* namespace gdb */
+
+/* A unique pointer to a splay tree.  */
+
+typedef std::unique_ptr<splay_tree_s, gdb::splay_tree_deleter>
+    gdb_splay_tree_up;
+
+#endif /* ! GDB_SPLAY_TREE_H */
index 98fff4f1b53e1ddf9d023e3ca18a21fe4f007660..b9d3cba931dfcf66867909474298b0debfa7561d 100644 (file)
@@ -46,7 +46,7 @@
 #include "valprint.h"
 #include "inferior.h"
 #include "osdata.h"
-#include "splay-tree.h"
+#include "common/gdb_splay_tree.h"
 #include "tracepoint.h"
 #include "ctf.h"
 #include "ada-lang.h"
@@ -719,13 +719,6 @@ splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
   return a - b;
 }
 
-static void
-free_splay_tree (void *xt)
-{
-  splay_tree t = (splay_tree) xt;
-  splay_tree_delete (t);
-}
-
 static void
 list_available_thread_groups (const std::set<int> &ids, int recurse)
 {
@@ -739,7 +732,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
      The vector contains information about all threads for the given pid.
      This is assigned an initial value to avoid "may be used uninitialized"
      warning from gcc.  */
-  splay_tree tree = NULL;
+  gdb_splay_tree_up tree;
 
   /* get_osdata will throw if it cannot return data.  */
   data = get_osdata ("processes");
@@ -750,10 +743,9 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
       struct osdata *threads = get_osdata ("threads");
 
       make_cleanup_osdata_free (threads);
-      tree = splay_tree_new (splay_tree_int_comparator,
-                            NULL,
-                            free_vector_of_osdata_items);
-      make_cleanup (free_splay_tree, tree);
+      tree.reset (splay_tree_new (splay_tree_int_comparator,
+                                 NULL,
+                                 free_vector_of_osdata_items));
 
       for (ix_items = 0;
           VEC_iterate (osdata_item_s, threads->items,
@@ -764,11 +756,11 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
          int pid_i = strtoul (pid, NULL, 0);
          VEC (osdata_item_s) *vec = 0;
 
-         splay_tree_node n = splay_tree_lookup (tree, pid_i);
+         splay_tree_node n = splay_tree_lookup (tree.get (), pid_i);
          if (!n)
            {
              VEC_safe_push (osdata_item_s, vec, item);
-             splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
+             splay_tree_insert (tree.get (), pid_i, (splay_tree_value)vec);
            }
          else
            {
@@ -812,7 +804,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
 
       if (recurse)
        {
-         splay_tree_node n = splay_tree_lookup (tree, pid_i);
+         splay_tree_node n = splay_tree_lookup (tree.get (), pid_i);
          if (n)
            {
              VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;