From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id DE6243857006 for ; Thu, 11 May 2023 14:50:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DE6243857006 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=efficios.com Received: from smarchi-efficios.internal.efficios.com (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 72FE11E128; Thu, 11 May 2023 10:50:35 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 09/12] gdb: link breakpoints with intrusive_list Date: Thu, 11 May 2023 10:48:29 -0400 Message-Id: <20230511144832.17974-10-simon.marchi@efficios.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230511144832.17974-1-simon.marchi@efficios.com> References: <20230511144832.17974-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3497.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_NONE,KAM_DMARC_STATUS,SPF_HELO_PASS,SPF_SOFTFAIL,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Replace the hand-maintained linked list with an intrusive_list. Since the breakpoint list (breakpoint_chain) is internal to breakpoint.c, the changes are mostly localized in breakpoint.c. Use reference_to_pointer_iterator to implement breakpoint_range, such that users of all_breakpoints and all_tracepoints don't need to change right now. It is removed in the following patch. Nothing too surprising other than that. Change-Id: I043d8d6f3dd864d80d5088f6ffc2c098337249ea --- gdb/breakpoint.c | 36 ++++++++++-------------------------- gdb/breakpoint.h | 13 ++++++++----- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index bd3258a742e2..5f47dc777438 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -614,14 +614,16 @@ bool target_exact_watchpoints = false; /* Chains of all breakpoints defined. */ -static struct breakpoint *breakpoint_chain; +static intrusive_list breakpoint_chain; /* See breakpoint.h. */ breakpoint_range all_breakpoints () { - return breakpoint_range (breakpoint_chain); + return breakpoint_range + (breakpoint_pointer_iterator (breakpoint_chain.begin ()), + breakpoint_pointer_iterator (breakpoint_chain.end ())); } /* See breakpoint.h. */ @@ -637,7 +639,9 @@ all_breakpoints_safe () tracepoint_range all_tracepoints () { - return tracepoint_range (breakpoint_chain); + return tracepoint_range + (tracepoint_iterator (breakpoint_pointer_iterator (breakpoint_chain.begin ())), + tracepoint_iterator (breakpoint_pointer_iterator (breakpoint_chain.end ()))); } /* Array is sorted by bp_location_is_less_than - primarily by the ADDRESS. */ @@ -7432,23 +7436,12 @@ decref_bp_location (struct bp_location **blp) static breakpoint * add_to_breakpoint_chain (std::unique_ptr &&b) { - struct breakpoint *b1; - struct breakpoint *result = b.get (); - /* Add this breakpoint to the end of the chain so that a list of breakpoints will come out in order of increasing numbers. */ - b1 = breakpoint_chain; - if (b1 == 0) - breakpoint_chain = b.release (); - else - { - while (b1->next) - b1 = b1->next; - b1->next = b.release (); - } + breakpoint_chain.push_back (*b.release ()); - return result; + return &breakpoint_chain.back (); } /* Initialize loc->function_name. */ @@ -12385,15 +12378,7 @@ delete_breakpoint (struct breakpoint *bpt) if (bpt->number) gdb::observers::breakpoint_deleted.notify (bpt); - if (breakpoint_chain == bpt) - breakpoint_chain = bpt->next; - - for (breakpoint *b : all_breakpoints ()) - if (b->next == bpt) - { - b->next = bpt->next; - break; - } + breakpoint_chain.erase (breakpoint_chain.iterator_to (*bpt)); /* Be sure no bpstat's are pointing at the breakpoint after it's been freed. */ @@ -14456,7 +14441,6 @@ _initialize_breakpoint () gdb::observers::memory_changed.attach (invalidate_bp_value_on_memory_change, "breakpoint"); - breakpoint_chain = 0; /* Don't bother to call set_breakpoint_count. $bpnum isn't useful before a breakpoint is set. */ breakpoint_count = 0; diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 8c9541902cdd..a03b57734b9d 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -616,7 +616,7 @@ using bp_location_range = iterator_range; /* Abstract base class representing all kinds of breakpoints. */ -struct breakpoint +struct breakpoint : public intrusive_list_node { breakpoint (struct gdbarch *gdbarch_, enum bptype bptype, bool temp = true, const char *cond_string = nullptr); @@ -789,7 +789,6 @@ struct breakpoint /* Nothing to do. */ } - breakpoint *next = NULL; /* Type of breakpoint. */ bptype type = bp_none; /* Zero means disabled; remember the info but don't break here. */ @@ -1892,11 +1891,15 @@ class scoped_rbreak_breakpoints /* Breakpoint linked list iterator. */ -using breakpoint_iterator = next_iterator; +using breakpoint_list = intrusive_list; + +using breakpoint_iterator = breakpoint_list::iterator; + +using breakpoint_pointer_iterator = reference_to_pointer_iterator; /* Breakpoint linked list range. */ -using breakpoint_range = iterator_range; +using breakpoint_range = iterator_range; /* Return a range to iterate over all breakpoints. */ @@ -1923,7 +1926,7 @@ struct tracepoint_filter /* Breakpoint linked list iterator, filtering to only keep tracepoints. */ using tracepoint_iterator - = filtered_iterator; + = filtered_iterator; /* Breakpoint linked list range, filtering to only keep tracepoints. */ -- 2.40.1