From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L2pKf-0005w2-Hk for qemu-devel@nongnu.org; Wed, 19 Nov 2008 10:51:09 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L2pKd-0005v9-Um for qemu-devel@nongnu.org; Wed, 19 Nov 2008 10:51:09 -0500 Received: from [199.232.76.173] (port=47678 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L2pKd-0005uo-L9 for qemu-devel@nongnu.org; Wed, 19 Nov 2008 10:51:07 -0500 Received: from lizzard.sbs.de ([194.138.37.39]:24300) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1L2pKc-0006ui-3i for qemu-devel@nongnu.org; Wed, 19 Nov 2008 10:51:06 -0500 Received: from mail1.sbs.de (localhost [127.0.0.1]) by lizzard.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id mAJFp3Fr010113 for ; Wed, 19 Nov 2008 16:51:03 +0100 Received: from [139.25.109.167] (mchn012c.mchp.siemens.de [139.25.109.167] (may be forged)) by mail1.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id mAJFp33D013758 for ; Wed, 19 Nov 2008 16:51:03 +0100 Message-ID: <492435B9.3010106@siemens.com> Date: Wed, 19 Nov 2008 16:50:17 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <20081119134857.26075.2417.stgit@mchn012c.ww002.siemens.net> <20081119134857.26075.9428.stgit@mchn012c.ww002.siemens.net> <492429F3.3010202@codemonkey.ws> In-Reply-To: <492429F3.3010202@codemonkey.ws> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 1/2] Add TAILQ_FOREACH_SAFE Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Anthony Liguori wrote: > Jan Kiszka wrote: >> Add TAILQ iterator that allows to safely remove elements while walking >> the list. >> >> Signed-off-by: Jan Kiszka >> --- >> >> sys-queue.h | 6 ++++++ >> 1 files changed, 6 insertions(+), 0 deletions(-) >> >> diff --git a/sys-queue.h b/sys-queue.h >> index 3d0773e..b92a77f 100644 >> --- a/sys-queue.h >> +++ b/sys-queue.h >> @@ -210,6 +210,12 @@ struct >> { \ >> >> (var); \ >> (var) = ((var)->field.tqe_next)) >> >> +#define TAILQ_FOREACH_SAFE(var, head, field, >> next_var) \ >> + for ((var) = >> ((head)->tqh_first); \ >> + (var) ? ({ (next_var) = ((var)->field.tqe_next); 1; >> }) \ >> + : >> 0; \ >> + (var) = (next_var)) >> > > So the Linux implementation of this is: > > #define list_for_each_safe(pos, n, head) \ > for (pos = (head)->next, n = pos->next; pos != (head); \ > pos = n, n = pos->next) This would relate to CIRCLEQ, not TAILQ. > > I'd prefer something similar: > > #define TAILQ_FOREACH_SAFE(var, head, field, next_var) > for (var = (head)->tqh_first, next_var = var->field.tqe_next; > var; > var = next_var, next_var = var->field.tqe_next) > > As it's functionally equivalent and avoids using a GCC-ism ({}). Won't fly, next_var can become NULL and would be dereferenced without a prior check. Unless I'm totally blind now, there is no TAILQ_FOREACH_SAFE without "GCC-ism". But I think I could switch to CIRCLEQ and add CIRCLEQ_FOREACH_SAFE instead. Jan -- Siemens AG, Corporate Technology, CT SE 2 ES-OS Corporate Competence Center Embedded Linux