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.
This commit is contained in:
Tom Tromey 2017-10-08 16:37:46 -06:00
parent 0c478e2d06
commit 1a56bfa56e
3 changed files with 56 additions and 16 deletions

View 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> 2017-10-09 Tom Tromey <tom@tromey.com>
* mi/mi-main.c (do_nothing): Remove. * mi/mi-main.c (do_nothing): Remove.

View File

@ -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 */

View File

@ -46,7 +46,7 @@
#include "valprint.h" #include "valprint.h"
#include "inferior.h" #include "inferior.h"
#include "osdata.h" #include "osdata.h"
#include "splay-tree.h" #include "common/gdb_splay_tree.h"
#include "tracepoint.h" #include "tracepoint.h"
#include "ctf.h" #include "ctf.h"
#include "ada-lang.h" #include "ada-lang.h"
@ -719,13 +719,6 @@ splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
return a - b; return a - b;
} }
static void
free_splay_tree (void *xt)
{
splay_tree t = (splay_tree) xt;
splay_tree_delete (t);
}
static void static void
list_available_thread_groups (const std::set<int> &ids, int recurse) 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. The vector contains information about all threads for the given pid.
This is assigned an initial value to avoid "may be used uninitialized" This is assigned an initial value to avoid "may be used uninitialized"
warning from gcc. */ warning from gcc. */
splay_tree tree = NULL; gdb_splay_tree_up tree;
/* get_osdata will throw if it cannot return data. */ /* get_osdata will throw if it cannot return data. */
data = get_osdata ("processes"); 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"); struct osdata *threads = get_osdata ("threads");
make_cleanup_osdata_free (threads); make_cleanup_osdata_free (threads);
tree = splay_tree_new (splay_tree_int_comparator, tree.reset (splay_tree_new (splay_tree_int_comparator,
NULL, NULL,
free_vector_of_osdata_items); free_vector_of_osdata_items));
make_cleanup (free_splay_tree, tree);
for (ix_items = 0; for (ix_items = 0;
VEC_iterate (osdata_item_s, threads->items, 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); int pid_i = strtoul (pid, NULL, 0);
VEC (osdata_item_s) *vec = 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) if (!n)
{ {
VEC_safe_push (osdata_item_s, vec, item); 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 else
{ {
@ -812,7 +804,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
if (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) if (n)
{ {
VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value; VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;