Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Dec 2001 17:14:08 -0800 (PST)
From:      Julian Elischer <julian@elischer.org>
To:        Marcel Moolenaar <marcel@xcllnt.net>
Cc:        John Baldwin <jhb@FreeBSD.org>, Poul-Henning Kamp <phk@critter.freebsd.dk>, cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org, Julian Elischer <julian@FreeBSD.org>, Greg Lehey <grog@FreeBSD.org>
Subject:   Re: cvs commit: src/share/man/man3 queue.3
Message-ID:  <Pine.BSF.4.21.0112311706450.10883-100000@InterJet.elischer.org>
In-Reply-To: <20011231165233.A408@dhcp01.pn.xcllnt.net>

next in thread | previous in thread | raw e-mail | index | archive | help


On Mon, 31 Dec 2001, Marcel Moolenaar wrote:

> On Mon, Dec 31, 2001 at 01:38:53PM -0800, Julian Elischer wrote:
> > > > 
> > > > _FOREACH() is for the plain & simple traversal of a queue(3) stucture,
> > > > anything more should explicitly state intent.
> > > 
> > > I would agree except for code like this:
> > > 
> > >         TAILQ_FOREACH(p, &list, p_next)
> > >                 if (some_test_on(p))
> > >                         break;
> > >         if (p != NULL) {
> > >                 /* Found one, now do something. */
> > >         }
> > 
> > This is the case I'm using it for.
> > except I'm doing:
> >          TAILQ_FOREACH(p, &list, p_next)
> >                  if (some_test_on(p))
> >                          break;
> >          if (p != NULL) {
> >                  /* Found it, now do something. */
> >          }
> > lots of code that MAY clear p
> >          if (p == NULL) {
> >                  /* didn't find it, or it was disqualified */
> >          }
> 
> I'd consider this a misuse of _FOREACH, because the something that's
> being done is definitely not done for each p. Even some_test_on() is
> not performed on each p. I'm with phk here.
> 
> Note that if it's simply too easy to use _FOREACH in these cases, we
> may want to consider creating a more suitable abstraction, like:
> 
> 	TAILQ_UNTIL(p, &list, p_next)
> 		some_test_on(p);
> 	if (p == 0)
> 		return ENOTFOUND;
> 	/* do something */
> 	return 0;
> 
> Just a thought.

So you think that the final value of p should be undefined,
and there is no  built in way to see if there were any elements in the
list at all or whether we completed the list?

just checking..

(sounds like a good excuse for adding more complicated code to me)

I'm just documenting what the code does, and how people have used it.
if you think that phk is correct we should add an example to the man page 
showing:


TAILQ_FOREACH(p, &list, p_next)
	if (some_test_on(p))
		goto fred;
	goto jim;
fred:	print ("we got one");
jim:

personally I thik that is more obscure than:
TAILQ_FOREACH(p, &list, p_next)
        if (some_test_on(p))
                break;
if (p) {
	print ("we got one");
}





To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0112311706450.10883-100000>