[PATCH v8 09/10] commit-reach: move min_generation check into paint_queue_get()
"Kristofer Karlsson via GitGitGadget" <[email protected]>
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <9a0f4df49a9b97ec819168ec0cbae96566df62b4.1786440533.git.gitgitgadget@gmail.com> |
From: Kristofer Karlsson <[email protected]> Consolidate the min_generation termination condition into paint_queue_get(), alongside the existing stale-entry and side-exhaustion checks. Move last_gen into struct paint_state so that commit_graph_generation() is called exactly once per dequeued commit and the result is shared across all termination checks and the monotonicity BUG assertion. Signed-off-by: Kristofer Karlsson <[email protected]> --- commit-reach.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index 7c5bbe00c3..32e65a52b5 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -90,6 +90,8 @@ struct paint_state { size_t parent2_count; size_t mb_candidate_count; int gen_ordered; + timestamp_t min_generation; + timestamp_t last_gen; timestamp_t topo_ceiling; }; @@ -140,11 +142,23 @@ static void paint_queue_put(struct paint_state *state, static struct commit *paint_queue_get(struct paint_state *state) { struct commit *commit = prio_queue_get(&state->queue); + timestamp_t generation; if (!commit) return NULL; commit->object.flags &= ~ENQUEUED; + generation = commit_graph_generation(commit); + + if (state->min_generation && generation > state->last_gen) + BUG("bad generation skip %"PRItime" > %"PRItime" at %s", + generation, state->last_gen, + oid_to_hex(&commit->object.oid)); + state->last_gen = generation; + + /* generation cutoff */ + if (generation < state->min_generation) + return NULL; /* * Check exit condition before decrementing: the counters @@ -159,7 +173,7 @@ static struct commit *paint_queue_get(struct paint_state *state) /* one side is exhausted */ if ((!state->parent1_count || !state->parent2_count) && state->gen_ordered && - commit_graph_generation(commit) < state->topo_ceiling) + generation < state->topo_ceiling) return NULL; } @@ -186,9 +200,10 @@ static int paint_down_to_common(struct repository *r, struct commit *commit; int i; int steps = 0; - timestamp_t last_gen = GENERATION_NUMBER_INFINITY; struct commit_list **tail = result; + state.min_generation = min_generation; + state.last_gen = GENERATION_NUMBER_INFINITY; state.topo_ceiling = corrected_commit_dates_enabled(r) ? GENERATION_NUMBER_INFINITY : GENERATION_NUMBER_V1_MAX; @@ -210,18 +225,8 @@ static int paint_down_to_common(struct repository *r, while ((commit = paint_queue_get(&state))) { struct commit_list *parents; int flags; - timestamp_t generation = commit_graph_generation(commit); steps++; - if (min_generation && generation > last_gen) - BUG("bad generation skip %"PRItime" > %"PRItime" at %s", - generation, last_gen, - oid_to_hex(&commit->object.oid)); - last_gen = generation; - - if (generation < min_generation) - break; - flags = commit->object.flags & (PARENT1 | PARENT2 | STALE); if (flags == (PARENT1 | PARENT2)) { if (!(commit->object.flags & RESULT)) { @@ -234,7 +239,7 @@ static int paint_down_to_common(struct repository *r, */ if (!(mb_flags & MERGE_BASE_FIND_ALL) && state.gen_ordered && - generation < state.topo_ceiling) + state.last_gen < state.topo_ceiling) break; } /* Mark parents of a found merge stale */ -- gitgitgadget