[PATCH 2/6] Iterate over ALL_TRACEPOINTS first.

Yao Qi
2012-12-04T04:45:25Z

Hi,
The 'breakpoint-modified' observer is notified on the breakpoint
level, in order to notify observer for a given tracepoint only once,
we change to iterate over tracepoint first, and then iterate over
locations of each tracepoint. In the inner loop, when we find a
tracepoint location is downloaded, we mark a flag, and notify the
observer in outer loop (on tracepoints) if flag is true. In short, we
change the iteration from:

ALL_BP_LOCATIONS (bl, blp_tmp)
{
if (!is_tracepoint (bl->owner))
continue;
}

to:

ALL_TRACEPOINTS (b)
{
for (bl = b->loc; bl; bl = bl->next)
{}
}

download_tracepoint_locations is called after breakpoint re-setting,
so I think this change has no functional affect.

gdb:

2012-12-03 Yao Qi <yao@codesourcery.com>

* breakpoint.c (download_tracepoint_locations): Iterate over
ALL_TRACEPOINTS first and then iterate over locations of
each tracepoint.
---
gdb/breakpoint.c | 33 +++++++++++++++++----------------
1 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 40d2edd..3f2f0c9 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -12078,7 +12078,7 @@ bp_location_target_extensions_update (void)
static void
download_tracepoint_locations (void)
{
- struct bp_location *bl, **blp_tmp;
+ struct breakpoint *b;
struct cleanup *old_chain;

if (!target_can_download_tracepoint ())
@@ -12086,31 +12086,32 @@ download_tracepoint_locations (void)

old_chain = save_current_space_and_thread ();

- ALL_BP_LOCATIONS (bl, blp_tmp)
+ ALL_TRACEPOINTS (b)
{
+ struct bp_location *bl;
struct tracepoint *t;

- if (!is_tracepoint (bl->owner))
- continue;
-
- if ((bl->owner->type == bp_fast_tracepoint
+ if ((b->type == bp_fast_tracepoint
? !may_insert_fast_tracepoints
: !may_insert_tracepoints))
continue;

- /* In tracepoint, locations are _never_ duplicated, so
- should_be_inserted is equivalent to
- unduplicated_should_be_inserted. */
- if (!should_be_inserted (bl) || bl->inserted)
- continue;
+ for (bl = b->loc; bl; bl = bl->next)
+ {
+ /* In tracepoint, locations are _never_ duplicated, so
+ should_be_inserted is equivalent to
+ unduplicated_should_be_inserted. */
+ if (!should_be_inserted (bl) || bl->inserted)
+ continue;

- switch_to_program_space_and_thread (bl->pspace);
+ switch_to_program_space_and_thread (bl->pspace);

- target_download_tracepoint (bl);
+ target_download_tracepoint (bl);

- bl->inserted = 1;
- t = (struct tracepoint *) bl->owner;
- t->number_on_target = bl->owner->number;
+ bl->inserted = 1;
+ }
+ t = (struct tracepoint *) b;
+ t->number_on_target = b->number;
}

do_cleanups (old_chain);
--
1.7.7.6