Change counted_command_line to a shared_ptr

This changes counted_command_line to be a typedef for std::shared_ptr
and removes the associated cleanups.  In the long run I believe that
cmd_list_element should also be changed to use a shared_ptr.

gdb/ChangeLog
2017-09-20  Tom Tromey  <tom@tromey.com>

	* breakpoint.c (struct counted_command_line): Remove.
	(breakpoint_commands): Update.
	(alloc_counted_command_line, incref_counted_command_line)
	(decref_counted_command_line, do_cleanup_counted_command_line)
	(make_cleanup_decref_counted_command_line): Remove.
	(breakpoint_set_commands, commands_command_1, ~bpstats, bpstats)
	(bpstat_clear_actions, bpstat_do_actions_1, watchpoint_check)
	(bpstat_stop_status, print_one_breakpoint_location, ~breakpoint)
	(save_breakpoints): Update.
	* breakpoint.h (counted_command_line): Now a typedef to
	shared_ptr.
	(struct breakpoint) <commands>: Now a counted_command_line.
	(struct bpstats) <command>: Likewise.
This commit is contained in:
Tom Tromey 2017-08-21 21:51:11 -06:00
parent 48649e1bfe
commit d1b0a7bfd3
3 changed files with 39 additions and 116 deletions

View File

@ -1,3 +1,19 @@
2017-09-20 Tom Tromey <tom@tromey.com>
* breakpoint.c (struct counted_command_line): Remove.
(breakpoint_commands): Update.
(alloc_counted_command_line, incref_counted_command_line)
(decref_counted_command_line, do_cleanup_counted_command_line)
(make_cleanup_decref_counted_command_line): Remove.
(breakpoint_set_commands, commands_command_1, ~bpstats, bpstats)
(bpstat_clear_actions, bpstat_do_actions_1, watchpoint_check)
(bpstat_stop_status, print_one_breakpoint_location, ~breakpoint)
(save_breakpoints): Update.
* breakpoint.h (counted_command_line): Now a typedef to
shared_ptr.
(struct breakpoint) <commands>: Now a counted_command_line.
(struct bpstats) <command>: Likewise.
2017-09-20 Tom Tromey <tom@tromey.com>
* breakpoint.c (struct commands_info, do_map_commands_command):

View File

@ -359,21 +359,10 @@ static char *dprintf_channel;
has disconnected. */
static int disconnected_dprintf = 1;
/* A reference-counted struct command_line. This lets multiple
breakpoints share a single command list. */
struct counted_command_line
{
/* The reference count. */
int refc;
/* The command list. */
struct command_line *commands;
};
struct command_line *
breakpoint_commands (struct breakpoint *b)
{
return b->commands ? b->commands->commands : NULL;
return b->commands ? b->commands.get () : NULL;
}
/* Flag indicating that a command has proceeded the inferior past the
@ -717,64 +706,6 @@ clear_breakpoint_hit_counts (void)
b->hit_count = 0;
}
/* Allocate a new counted_command_line with reference count of 1.
The new structure owns COMMANDS. */
static struct counted_command_line *
alloc_counted_command_line (struct command_line *commands)
{
struct counted_command_line *result = XNEW (struct counted_command_line);
result->refc = 1;
result->commands = commands;
return result;
}
/* Increment reference count. This does nothing if CMD is NULL. */
static void
incref_counted_command_line (struct counted_command_line *cmd)
{
if (cmd)
++cmd->refc;
}
/* Decrement reference count. If the reference count reaches 0,
destroy the counted_command_line. Sets *CMDP to NULL. This does
nothing if *CMDP is NULL. */
static void
decref_counted_command_line (struct counted_command_line **cmdp)
{
if (*cmdp)
{
if (--(*cmdp)->refc == 0)
{
free_command_lines (&(*cmdp)->commands);
xfree (*cmdp);
}
*cmdp = NULL;
}
}
/* A cleanup function that calls decref_counted_command_line. */
static void
do_cleanup_counted_command_line (void *arg)
{
decref_counted_command_line ((struct counted_command_line **) arg);
}
/* Create a cleanup that calls decref_counted_command_line on the
argument. */
static struct cleanup *
make_cleanup_decref_counted_command_line (struct counted_command_line **cmdp)
{
return make_cleanup (do_cleanup_counted_command_line, cmdp);
}
/* Return the breakpoint with the specified number, or NULL
if the number does not refer to an existing breakpoint. */
@ -1303,8 +1234,7 @@ breakpoint_set_commands (struct breakpoint *b,
{
validate_commands_for_breakpoint (b, commands.get ());
decref_counted_command_line (&b->commands);
b->commands = alloc_counted_command_line (commands.release ());
b->commands = std::move (commands);
observer_notify_breakpoint_modified (b);
}
@ -1360,12 +1290,7 @@ static void
commands_command_1 (const char *arg, int from_tty,
struct command_line *control)
{
struct cleanup *cleanups;
struct counted_command_line *cmd = NULL;
/* If we read command lines from the user, then `info' will hold an
extra reference to the commands that we must clean up. */
cleanups = make_cleanup_decref_counted_command_line (&cmd);
counted_command_line cmd;
std::string new_arg;
@ -1384,10 +1309,8 @@ commands_command_1 (const char *arg, int from_tty,
{
if (cmd == NULL)
{
command_line_up l;
if (control != NULL)
l = copy_command_lines (control->body_list[0]);
cmd = copy_command_lines (control->body_list[0]);
else
{
struct cleanup *old_chain;
@ -1399,25 +1322,21 @@ commands_command_1 (const char *arg, int from_tty,
old_chain = make_cleanup (xfree, str);
l = read_command_lines (str,
from_tty, 1,
(is_tracepoint (b)
? check_tracepoint_command : 0),
b);
cmd = read_command_lines (str,
from_tty, 1,
(is_tracepoint (b)
? check_tracepoint_command : 0),
b);
do_cleanups (old_chain);
}
cmd = alloc_counted_command_line (l.release ());
}
/* If a breakpoint was on the list more than once, we don't need to
do anything. */
if (b->commands != cmd)
{
validate_commands_for_breakpoint (b, cmd->commands);
incref_counted_command_line (cmd);
decref_counted_command_line (&b->commands);
validate_commands_for_breakpoint (b, cmd.get ());
b->commands = cmd;
observer_notify_breakpoint_modified (b);
}
@ -1425,8 +1344,6 @@ commands_command_1 (const char *arg, int from_tty,
if (cmd == NULL)
error (_("No breakpoints specified."));
do_cleanups (cleanups);
}
static void
@ -4421,7 +4338,6 @@ bpstats::~bpstats ()
{
if (old_val != NULL)
value_free (old_val);
decref_counted_command_line (&commands);
if (bp_location_at != NULL)
decref_bp_location (&bp_location_at);
}
@ -4463,7 +4379,6 @@ bpstats::bpstats (const bpstats &other)
release_value (old_val);
}
incref_bp_location (bp_location_at);
incref_counted_command_line (commands);
}
/* Return a copy of a bpstat. Like "bs1 = bs2" but all storage that
@ -4582,7 +4497,7 @@ bpstat_clear_actions (void)
for (bs = tp->control.stop_bpstat; bs != NULL; bs = bs->next)
{
decref_counted_command_line (&bs->commands);
bs->commands = NULL;
if (bs->old_val != NULL)
{
@ -4661,9 +4576,7 @@ bpstat_do_actions_1 (bpstat *bsp)
breakpoint_proceeded = 0;
for (; bs != NULL; bs = bs->next)
{
struct counted_command_line *ccmd;
struct command_line *cmd;
struct cleanup *this_cmd_tree_chain;
struct command_line *cmd = NULL;
/* Take ownership of the BSP's command tree, if it has one.
@ -4675,10 +4588,10 @@ bpstat_do_actions_1 (bpstat *bsp)
commands are only executed once, we don't need to copy it; we
can clear the pointer in the bpstat, and make sure we free
the tree when we're done. */
ccmd = bs->commands;
counted_command_line ccmd = bs->commands;
bs->commands = NULL;
this_cmd_tree_chain = make_cleanup_decref_counted_command_line (&ccmd);
cmd = ccmd ? ccmd->commands : NULL;
if (ccmd != NULL)
cmd = ccmd.get ();
if (command_line_is_silent (cmd))
{
/* The action has been already done by bpstat_stop_status. */
@ -4695,9 +4608,6 @@ bpstat_do_actions_1 (bpstat *bsp)
cmd = cmd->next;
}
/* We can free this command tree now. */
do_cleanups (this_cmd_tree_chain);
if (breakpoint_proceeded)
{
if (current_ui->async)
@ -5233,7 +5143,7 @@ watchpoint_check (void *p)
}
/* Make sure the watchpoint's commands aren't executed. */
decref_counted_command_line (&b->commands);
b->commands = NULL;
watchpoint_del_at_next_stop (b);
return WP_DELETED;
@ -5723,9 +5633,8 @@ bpstat_stop_status (struct address_space *aspace,
if (b->silent)
bs->print = 0;
bs->commands = b->commands;
incref_counted_command_line (bs->commands);
if (command_line_is_silent (bs->commands
? bs->commands->commands : NULL))
? bs->commands.get () : NULL))
bs->print = 0;
b->ops->after_condition_true (bs);
@ -6588,7 +6497,7 @@ print_one_breakpoint_location (struct breakpoint *b,
}
}
l = b->commands ? b->commands->commands : NULL;
l = b->commands ? b->commands.get () : NULL;
if (!part_of_multiple && l)
{
annotate_field (9);
@ -12625,7 +12534,6 @@ static const struct bp_location_ops bp_location_ops =
breakpoint::~breakpoint ()
{
decref_counted_command_line (&this->commands);
xfree (this->cond_string);
xfree (this->extra_string);
xfree (this->filter);
@ -15376,7 +15284,7 @@ save_breakpoints (char *filename, int from_tty,
current_uiout->redirect (&fp);
TRY
{
print_command_lines (current_uiout, tp->commands->commands, 2);
print_command_lines (current_uiout, tp->commands.get (), 2);
}
CATCH (ex, RETURN_MASK_ALL)
{

View File

@ -657,10 +657,9 @@ enum watchpoint_triggered
typedef struct bp_location *bp_location_p;
DEF_VEC_P(bp_location_p);
/* A reference-counted struct command_line. This lets multiple
breakpoints share a single command list. This is an implementation
/* A reference-counted struct command_line. This is an implementation
detail to the breakpoints module. */
struct counted_command_line;
typedef std::shared_ptr<command_line> counted_command_line;
/* Some targets (e.g., embedded PowerPC) need two debug registers to set
a watchpoint over a memory region. If this flag is true, GDB will use
@ -712,7 +711,7 @@ struct breakpoint
/* Chain of command lines to execute when this breakpoint is
hit. */
counted_command_line *commands = NULL;
counted_command_line commands;
/* Stack depth (address of frame). If nonzero, break only if fp
equals this. */
struct frame_id frame_id = null_frame_id;
@ -1118,7 +1117,7 @@ struct bpstats
struct breakpoint *breakpoint_at;
/* The associated command list. */
struct counted_command_line *commands;
counted_command_line commands;
/* Old value associated with a watchpoint. */
struct value *old_val;