Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Dec 2001 16:52:33 -0800
From:      Marcel Moolenaar <marcel@xcllnt.net>
To:        Julian Elischer <julian@elischer.org>
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:  <20011231165233.A408@dhcp01.pn.xcllnt.net>
In-Reply-To: <Pine.BSF.4.21.0112311328270.94344-100000@InterJet.elischer.org>
References:  <XFMail.011231123912.jhb@FreeBSD.org> <Pine.BSF.4.21.0112311328270.94344-100000@InterJet.elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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.

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel@xcllnt.net

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?20011231165233.A408>