Remove make_cleanup_free_so

make_cleanup_free_so is used in a single spot.  This patch introduces
a unique pointer wrapper for struct so_list, and changes this spot to
use it.

ChangeLog
2017-08-03  Tom Tromey  <tom@tromey.com>

	* utils.h (make_cleanup_free_so): Remove.
	* utils.c (do_free_so, make_cleanup_free_so): Remove.
	* solist.h (struct so_deleter): New.
	(so_list_up): New typedef.
	* solib-svr4.c (svr4_read_so_list): Use so_list_up.
This commit is contained in:
Tom Tromey 2017-04-28 22:43:54 -06:00
parent e3ad2841b1
commit b3bc84537b
5 changed files with 26 additions and 39 deletions

View File

@ -1,3 +1,11 @@
2017-08-03 Tom Tromey <tom@tromey.com>
* utils.h (make_cleanup_free_so): Remove.
* utils.c (do_free_so, make_cleanup_free_so): Remove.
* solist.h (struct so_deleter): New.
(so_list_up): New typedef.
* solib-svr4.c (svr4_read_so_list): Use so_list_up.
2017-08-03 Tom Tromey <tom@tromey.com>
* utils.h (make_cleanup_restore_current_language): Remove.

View File

@ -1350,21 +1350,15 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
for (; lm != 0; prev_lm = lm, lm = next_lm)
{
struct so_list *newobj;
struct cleanup *old_chain;
int errcode;
char *buffer;
newobj = XCNEW (struct so_list);
old_chain = make_cleanup_free_so (newobj);
so_list_up newobj (XCNEW (struct so_list));
lm_info_svr4 *li = lm_info_read (lm);
newobj->lm_info = li;
if (li == NULL)
{
do_cleanups (old_chain);
return 0;
}
return 0;
next_lm = li->l_next;
@ -1373,7 +1367,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
warning (_("Corrupted shared library list: %s != %s"),
paddress (target_gdbarch (), prev_lm),
paddress (target_gdbarch (), li->l_prev));
do_cleanups (old_chain);
return 0;
}
@ -1388,7 +1381,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
first_l_name = li->l_name;
info->main_lm_addr = li->lm_addr;
do_cleanups (old_chain);
continue;
}
@ -1404,7 +1396,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
if (first_l_name == 0 || li->l_name != first_l_name)
warning (_("Can't read pathname for load map: %s."),
safe_strerror (errcode));
do_cleanups (old_chain);
continue;
}
@ -1416,15 +1407,12 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
/* If this entry has no name, or its name matches the name
for the main executable, don't include it in the list. */
if (! newobj->so_name[0] || match_main (newobj->so_name))
{
do_cleanups (old_chain);
continue;
}
continue;
discard_cleanups (old_chain);
newobj->next = 0;
**link_ptr_ptr = newobj;
*link_ptr_ptr = &newobj->next;
/* Don't free it now. */
**link_ptr_ptr = newobj.release ();
*link_ptr_ptr = &(**link_ptr_ptr)->next;
}
return 1;

View File

@ -179,6 +179,18 @@ struct target_so_ops
/* Free the memory associated with a (so_list *). */
void free_so (struct so_list *so);
/* A deleter that calls free_so. */
struct so_deleter
{
void operator() (struct so_list *so) const
{
free_so (so);
}
};
/* A unique pointer to a so_list. */
typedef std::unique_ptr<so_list, so_deleter> so_list_up;
/* Return address of first so_list entry in master shared object list. */
struct so_list *master_so_list (void);

View File

@ -268,24 +268,6 @@ make_cleanup_value_free (struct value *value)
return make_cleanup (do_value_free, value);
}
/* Helper for make_cleanup_free_so. */
static void
do_free_so (void *arg)
{
struct so_list *so = (struct so_list *) arg;
free_so (so);
}
/* Make cleanup handler calling free_so for SO. */
struct cleanup *
make_cleanup_free_so (struct so_list *so)
{
return make_cleanup (do_free_so, so);
}
/* Helper function for make_cleanup_clear_parser_state. */
static void

View File

@ -110,9 +110,6 @@ extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops);
extern struct cleanup *make_cleanup_value_free_to_mark (struct value *);
extern struct cleanup *make_cleanup_value_free (struct value *);
struct so_list;
extern struct cleanup *make_cleanup_free_so (struct so_list *so);
/* A deleter for a hash table. */
struct htab_deleter
{