Derrick Stolee <dsto...@microsoft.com> writes: > @@ -800,17 +810,26 @@ static struct commit_list *paint_down_to_common(struct > commit *one, int n, struc > return result; > } > prio_queue_put(&queue, one); > + if (one->generation < min_nonstale_gen) > + min_nonstale_gen = one->generation; > > for (i = 0; i < n; i++) { > twos[i]->object.flags |= PARENT2; > prio_queue_put(&queue, twos[i]); > + if (twos[i]->generation < min_nonstale_gen) > + min_nonstale_gen = twos[i]->generation; > } > > - while (queue_has_nonstale(&queue)) { > + while (queue_has_nonstale(&queue, min_nonstale_gen)) { > struct commit *commit = prio_queue_get(&queue); > struct commit_list *parents; > int flags; > > + if (commit->generation > last_gen) > + BUG("bad generation skip"); > + > + last_gen = commit->generation; > + > flags = commit->object.flags & (PARENT1 | PARENT2 | STALE); > if (flags == (PARENT1 | PARENT2)) { > if (!(commit->object.flags & RESULT)) { > @@ -830,6 +849,10 @@ static struct commit_list *paint_down_to_common(struct > commit *one, int n, struc > return NULL; > p->object.flags |= flags;
Hmph. Can a commit that used to be not stale (and contributed to the current value of min_nonstale_gen) become stale here by getting visited twice, invalidating the value in min_nonstale_gen? > prio_queue_put(&queue, p); > + > + if (!(flags & STALE) && > + p->generation < min_nonstale_gen) > + min_nonstale_gen = p->generation; > } > }