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: Andrew Morton <akpm at linux-foundation dot org>
- To: Masami Hiramatsu <mhiramat at redhat dot com>
- 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 14:00:07 -0700
- Subject: Re: [PATCH -mm 1/5] list.h: add list_singleton
- References: <47DAE2C4.2060303@redhat.com>
On Fri, 14 Mar 2008 16:40:36 -0400
Masami Hiramatsu <mhiramat@redhat.com> wrote:
> Add list_singleton to check a list has just one entry.
>
> list_singleton is useful to check whether a list_head which
> have been temporarily allocated for listing objects can be
> released or not.
>
> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
> ---
> include/linux/list.h | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> Index: 2.6.25-rc5-mm1/include/linux/list.h
> ===================================================================
> --- 2.6.25-rc5-mm1.orig/include/linux/list.h
> +++ 2.6.25-rc5-mm1/include/linux/list.h
> @@ -211,6 +211,15 @@ static inline int list_empty_careful(con
> return (next == head) && (next == head->prev);
> }
>
> +/**
> + * list_singleton - tests whether a list has just one entry.
> + * @head: the list to test.
> + */
> +static inline int list_singleton(const struct list_head *head)
> +{
> + return !list_empty(head) && (head->next == head->prev);
> +}
> +
This hurts my brain.
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.
So I guess we can proceed with your list_singleton(), but I'd just like to
flag this possible confusion, see what people think..