From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: pasky@suse.cz, git@vger.kernel.org
Subject: Re: [PATCH 2/2] sort_in_topological_order(): avoid setting a commit flag
Date: Wed, 23 Jul 2008 20:33:53 +0100 (BST) [thread overview]
Message-ID: <alpine.DEB.1.00.0807232014260.8986@racer> (raw)
In-Reply-To: <7vprp4ctkp.fsf@gitster.siamese.dyndns.org>
Hi,
On Wed, 23 Jul 2008, Junio C Hamano wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>
> > @@ -494,7 +493,8 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
> > * when all their children have been emitted thereby
> > * guaranteeing topological order.
> > */
> > - if (!--parent->indegree) {
> > + if (--parent->indegree == 1) {
> > + parent->indegree = 0;
> > if (!lifo)
> > insert_by_date(parent, &work);
> > else
> > @@ -505,7 +505,6 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
> > * work_item is a commit all of whose children
> > * have already been emitted. we can emit it now.
> > */
> > - commit->object.flags &= ~TOPOSORT;
> > *pptr = work_item;
> > pptr = &work_item->next;
> > }
>
> These two hunks look suspicious.
>
> The "tips" used to enter that while() loop with zero indegree, its
> parents examined and then entered the final list pointed by pptr with
> the toposort scratch variables removed and indegree set to zero. Now
> with the new +1 based code, they enter the while() loop with 1 indegree,
> and enter the final list with indegree set to 1.
Almost correct. The way I did it the if() is entered with indegree ==
1, but is set indegree to 0 right away.
I did it this way because of these two lines before the if():
if (!parent->indegree)
continue;
These are the replacement for the previous
if (!(parent->object.flags & TOPOSORT))
continue;
Now, if indegree was not set to 0, that if () would not trigger, but in
the next one (the first hunk you quoted), indegree was decremented and
failed the test == 1.
However, that is correct only by pure chance; I certainly missed that.
The correct fix according to my thinking would be to set the indegree to 0
when the tips are inserted, too.
> A parent that has only one child that is "tip" is discovered in the
> while() loop, its indegree decremented (so it goes down to zero in the
> original code and 1 in yours) and enters work queue to be processed.
> It used to have the toposort scratch variable removed in the second hunk
> above, but that is done in the first hunk in your version.
>
> So after this patch, indegree will be all zero for non-tip commits but
> will be one for tip commits. Is this intended?
No.
> I'd suggest dropping the "parent->indegree = 0" assignment and turn the
> second hunk into "commit->indgree = 0" assignment.
Yeah, that is much simpler.
Thanks,
Dscho
prev parent reply other threads:[~2008-07-23 19:34 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-23 0:50 [PATCH 1/2] Add test to show that show-branch misses out the 8th column Johannes Schindelin
2008-07-23 0:51 ` [PATCH 2/2] sort_in_topological_order(): avoid setting a commit flag Johannes Schindelin
2008-07-23 1:01 ` Junio C Hamano
2008-07-23 15:39 ` Jon Loeliger
2008-07-23 21:49 ` Petr Baudis
2008-07-23 22:07 ` Junio C Hamano
2008-07-23 19:02 ` Junio C Hamano
2008-07-23 19:33 ` Johannes Schindelin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.1.00.0807232014260.8986@racer \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pasky@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox