This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: [PATCH -mm 1/5] list.h: add list_singleton
- From: Masami Hiramatsu <mhiramat at redhat dot com>
- To: Andrew Morton <akpm at linux-foundation dot org>
- Cc: ananth at in dot ibm dot com, jkenisto at us dot ibm dot com, linux-kernel at vger dot kernel dot org, systemtap at sources dot redhat dot com, prasanna at in dot ibm dot com, shaohua dot li at intel dot com, davem at davemloft dot net, fche at redhat dot com
- Date: Fri, 14 Mar 2008 18:22:26 -0400
- Subject: Re: [PATCH -mm 1/5] list.h: add list_singleton
- References: <47DAE2C4.2060303@redhat.com> <20080314140007.a7b495d7.akpm@linux-foundation.org>
Andrew Morton wrote:
> If your usage pattern is:
>
> struct foo {
> ...
> struct list_head bar_list; /* A list of `struct bar's */
> };
>
> struct bar {
> struct list_head list; /* Attached to foo.bar_list */
> ...
> };
>
> then yes, list_singleton() makes sense.
>
> But in other usage patterns it does not:
>
> struct foo {
> struct bar *bar_list;
> ...
> };
>
> struct bar {
> struct list_head list; /* All the other bars go here */
> ...
> };
>
> In the second case, emptiness is signified by foo.bar_list==NULL. And in
> this case, code which does
>
> if (foo->bar_list && list_singleton(&foo->bar_list->list))
>
> will fail if there is a single item on the list!
>
> The second usage pattern is uncommon and list_empty() also returns
> misleading answers when list_heads are used this way.
I agreed. I assume that list_singleton() is used like as list_empty().
> So I guess we can proceed with your list_singleton(), but I'd just like to
> flag this possible confusion, see what people think..
Thank you,
--
Masami Hiramatsu
Software Engineer
Hitachi Computer Products (America) Inc.
Software Solutions Division
e-mail: mhiramat@redhat.com