diff options
author | Tom Tromey <tom@tromey.com> | 2017-10-08 16:37:46 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-10-09 17:39:29 -0600 |
commit | 1a56bfa56ed967c5f6ed98f75834408417a062ff (patch) | |
tree | 4f61c01e698ae009e4bfca0a0a54f69ff09977ed | |
parent | 0c478e2d060bebea341696806fed6f67122efab6 (diff) | |
download | binutils-gdb-1a56bfa56ed967c5f6ed98f75834408417a062ff.tar.gz |
Remove free_splay_tree cleanup
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.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/common/gdb_splay_tree.h | 42 | ||||
-rw-r--r-- | gdb/mi/mi-main.c | 24 |
3 files changed, 56 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ce21e258730..bc6cad3003e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 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. (list_available_thread_groups): Update. diff --git a/gdb/common/gdb_splay_tree.h b/gdb/common/gdb_splay_tree.h new file mode 100644 index 00000000000..1a6577bd42f --- /dev/null +++ b/gdb/common/gdb_splay_tree.h @@ -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 */ diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 98fff4f1b53..b9d3cba931d 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -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" @@ -720,13 +720,6 @@ splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb) } 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) { struct osdata *data; @@ -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; |