Re: gitk problems: can't unset "idinlist(...)"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Sat, 21 Jul 2007, Jeff King wrote:
> 
> By which I mean you can keep the 'for' loop, since in either case we are
> always reading p->next (if we skip, then we set *pp to p->next anyway,
> and if we don't, then pp becomes a pointer to p->next).
> 
> So this is a more readable patch which I believe is equivalent.

Fair enough, that also works.

Anyway, just because this is actually something I've noticed a lot of 
people do wrong, I actually do tend to think that when you traverse a 
singly-linked list and remove entries, you should *never* traverse the 
list itself, you should only ever traverse the "pointer to the pointer".

So the difference between your version and mine is that the

	while ((p = *pp) != NULL)

model really only has one single "iterator variable": "pp". Which makes it 
a lot easier to think about and avoid problems.

In contrast, your for-loop actually keeps track of *two* independent 
variables, the "tail pointer of the list we're building up" (pp) and the 
"head pointer of the old list we're traversing" (p).

Does it work? Yes. But I tend to prefer the "there's a single list" model, 
where you just remove entries as you traverse it through a single indirect 
pointer.

They're certainly equivalent, but slightly different mindsets. I at least 
personally find the "single pointer" less likely to have problems, because 
you can never get out of sync (which was basically exactly the problem 
that Junio's code had), because there is nothing to get out of sync _with_ 
when you just have a single main iterator variable.

			Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux