Re: hlist_for_each_entry && pos (Was: task_work_queue)

From: Oleg Nesterov
Date: Thu Apr 12 2012 - 00:29:40 EST


On 04/11, Linus Torvalds wrote:
>
> On Wed, Apr 11, 2012 at 9:00 PM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote:
> >
> > This reminds me.
> >
> > hlist_for_each_entry_*() do not need "pos", it can be
> >
> > Â Â Â Â#define hlist_for_each_entry(pos, head, member) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
> > Â Â Â Â Â Â Â Âfor (pos = (void*)(head)->first; Â Â Â Â Â Â Â Â ï \
> > Â Â Â Â Â Â Â Âpos && ({ pos = hlist_entry((void*)pos, typeof(*pos), member); 1; }); Â \
> > Â Â Â Â Â Â Â Âpos = (void*)(pos)->member.next)
>
> Ugh. I'm not sure that is any better, with the extra casts to hide the
> fact that you use the wrong type pointers for it.
>
> Are there any code generation improvements?

Not sure, I'll check...

> Because quite frankly, if there aren't, I think the code churn just
> isn't worth it - especially with how ugly the macro is.

Ah, personally I think that "how ugly the macro" doesn't matter.
What does matter (imho again), it simplifies the usage.

> This is one of those things where the C99 features would actually be
> nice: one of the few features from C++ that I actually liked is the
> ability to declare the induction variable. So
>
> #define hlist_for_each_entry(pos, head, member) \
> for (void *__pos = (head)->first; \

Agreed. But,

error: 'for' loop initial declaration used outside C99 mode

we should change CFLAGS, I guess. BTW, personally I'd like very much
to use "for (type var; ...")" if this was allowed.

> That said, "pretty macro" isn't very high
> on the list of things to worry about. Not nearly as high as the pain
> changing the interface would cause for things that *should* be trivial
> (like backporting patches etc).

Yes, agreed, that was the question.

> So I'd really want to see some more tangible advantage.

OK, I'll check the code generation just in case.

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/