Make bp_location derive from refcounted_object

This changes bp_location to derive from refcounted_object, introduces
a ref_ptr specialization for this type, and then changes
bpstats::bp_location_at to use that specialization.  This removes some
manual reference counting and simplifies the code.

gdb/ChangeLog
2020-12-11  Tom Tromey  <tom@tromey.com>

	* inline-frame.c (stopped_by_user_bp_inline_frame): Update.
	* ada-lang.c (check_status_exception): Update.
	* breakpoint.c (free_bp_location): Remove.
	(decref_bp_location): Use bp_location_ref_policy.
	(bpstats::bpstats): Don't call incref_bp_location.
	(bpstats::~bpstats): Remove.
	(bpstats::bpstats): Update.
	(bpstat_check_watchpoint, bpstat_check_breakpoint_conditions)
	(bp_location::bp_location): Update.
	(incref_bp_location): Remove.
	(bkpt_print_it): Update.
	* breakpoint.h (class bp_location): Derive from
	refcounted_object.
	(struct bpstats): Remove destructor.
	<bp_location_at>: Now a bp_location_ref_ptr.
	<refc>: Remove.
	(bp_location_ref_ptr): New typedef.
	(struct bp_location_ref_policy): New.
This commit is contained in:
Tom Tromey
2020-12-11 09:21:53 -07:00
parent bfcb9db853
commit b6433ede07
5 changed files with 53 additions and 45 deletions

View File

@@ -29,6 +29,7 @@
#include <vector>
#include "gdbsupport/array-view.h"
#include "gdbsupport/function-view.h"
#include "gdbsupport/refcounted-object.h"
#include "cli/cli-script.h"
struct block;
@@ -311,7 +312,7 @@ enum bp_loc_type
bp_loc_other /* Miscellaneous... */
};
class bp_location
class bp_location : public refcounted_object
{
public:
bp_location () = default;
@@ -329,9 +330,6 @@ public:
the same parent breakpoint. */
bp_location *next = NULL;
/* The reference count. */
int refc = 0;
/* Type of this breakpoint location. */
bp_loc_type loc_type {};
@@ -510,6 +508,27 @@ public:
const struct objfile *objfile = NULL;
};
/* A policy class for bp_location reference counting. */
struct bp_location_ref_policy
{
static void incref (bp_location *loc)
{
loc->incref ();
}
static void decref (bp_location *loc)
{
gdb_assert (loc->refcount () > 0);
loc->decref ();
if (loc->refcount () == 0)
delete loc;
}
};
/* A gdb::ref_ptr that has been specialized for bp_location. */
typedef gdb::ref_ptr<bp_location, bp_location_ref_policy>
bp_location_ref_ptr;
/* The possible return values for print_bpstat, print_it_normal,
print_it_done, print_it_noop. */
enum print_stop_action
@@ -1130,7 +1149,6 @@ struct bpstats
{
bpstats ();
bpstats (struct bp_location *bl, bpstat **bs_link_pointer);
~bpstats ();
bpstats (const bpstats &);
bpstats &operator= (const bpstats &) = delete;
@@ -1155,7 +1173,7 @@ struct bpstats
What this means is that we should not (in most cases) follow
the `bpstat->bp_location->owner' link, but instead use the
`breakpoint_at' field below. */
struct bp_location *bp_location_at;
bp_location_ref_ptr bp_location_at;
/* Breakpoint that caused the stop. This is nullified if the
breakpoint ends up being deleted. See comments on