[Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-04-27 Thread Jason Ekstrand
---
 src/util/list.h | 13 +
 1 file changed, 13 insertions(+)

diff --git a/src/util/list.h b/src/util/list.h
index 6144b0c..246f826 100644
--- a/src/util/list.h
+++ b/src/util/list.h
@@ -92,6 +92,19 @@ static inline void list_delinit(struct list_head *item)
 item->prev = item;
 }
 
+static inline bool list_empty(struct list_head *list)
+{
+   return list->next == list;
+}
+
+static inline unsigned list_length(struct list_head *list)
+{
+   unsigned length = 0;
+   for (struct list_head *node = list->next; node != list; node = node->next)
+  length++;
+   return length;
+}
+
 #define LIST_INITHEAD(__item) list_inithead(__item)
 #define LIST_ADD(__item, __list) list_add(__item, __list)
 #define LIST_ADDTAIL(__item, __list) list_addtail(__item, __list)
-- 
2.3.6

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-05-11 Thread Neil Roberts
Ian Romanick  writes:

>> For what it's worth, I'm strongly in favour of using these
>> kernel-style lists instead of exec_list. The kernel ones seem much
>> less confusing.
>
> Huh? They're practically identical. The only difference is the
> kernel-style lists have a single sentinel node, and that node is
> impossible to identify "in a crowd." The exec_lists use two sentinel
> nodes, and those nodes have one pointer of overlapping storage (head
> and tail are the next and prev pointers of one node, and tail and
> tail_pred are the next and prev pointers of the other). I thought
> there was some ASCII art in list.h that showed this, but that appears
> to not be the case...

Yes, I understand how they work. But you have to admit that the magic of
making the end sentinel overlap with the head sentinel is a bit more
difficult to get your head around then just having a single sentinel. At
least personally I found that more confusing.

> This gives some convenience that you can walk through a list from any
> node in the list without having a pointer to the list itself. I don't
> know if we still do, but there used to be a few places where we took
> advantage of that.

Ok, that is a good point. However if we can't find any examples of where
we are doing this then maybe it isn't all that important. A counter
advantage of the kernel-style lists is that the sentinel is slightly
smaller (one fewer pointer). That might be an important consideration if
you're using them to build up a tree structure with a lot of lists, like
an AST.

However the main advantage for me is that saying “they're easy, they're
just like in the kernel and Wayland” is a lot more likely to have
meaning for someone than saying “they're just like on the Amiga”!

Regards,
- Neil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-05-05 Thread Neil Roberts
Jason Ekstrand  writes:

> +static inline bool list_empty(struct list_head *list)
> +{
> +   return list->next == list;
> +}

It would be good if list.h also included stdbool.h in order to get the
declaration of bool. However, will that cause problems on MSVC? Is the
Gallium code compiled on MSVC in general?

> +static inline unsigned list_length(struct list_head *list)
> +{
> +   unsigned length = 0;
> +   for (struct list_head *node = list->next; node != list; node = node->next)
> +  length++;
> +   return length;
> +}

Any reason not to use one of the list iterator macros here? Is it safe
to use a C99-ism outside of a macro in this header? Maybe MSVC
supports this particular C99-ism anyway.

For what it's worth, I'm strongly in favour of using these kernel-style
lists instead of exec_list. The kernel ones seem much less confusing.

Regards,
- Neil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-05-05 Thread Jason Ekstrand
On Tue, May 5, 2015 at 11:21 AM, Neil Roberts  wrote:
> Jason Ekstrand  writes:
>
>> +static inline bool list_empty(struct list_head *list)
>> +{
>> +   return list->next == list;
>> +}
>
> It would be good if list.h also included stdbool.h in order to get the
> declaration of bool. However, will that cause problems on MSVC? Is the
> Gallium code compiled on MSVC in general?

Rob Clark pointed that out.  I've fixed it locally.

>> +static inline unsigned list_length(struct list_head *list)
>> +{
>> +   unsigned length = 0;
>> +   for (struct list_head *node = list->next; node != list; node = 
>> node->next)
>> +  length++;
>> +   return length;
>> +}
>
> Any reason not to use one of the list iterator macros here? Is it safe
> to use a C99-ism outside of a macro in this header? Maybe MSVC
> supports this particular C99-ism anyway.

Because the list iterators work on a subtype and making them work on
the  node itself is kind of painful.  Why C99? No good reason, I could
can that easily enough.
--Jason

> For what it's worth, I'm strongly in favour of using these kernel-style
> lists instead of exec_list. The kernel ones seem much less confusing.
>
> Regards,
> - Neil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-05-05 Thread Brian Paul

On 05/05/2015 12:21 PM, Neil Roberts wrote:

Jason Ekstrand  writes:


+static inline bool list_empty(struct list_head *list)
+{
+   return list->next == list;
+}


It would be good if list.h also included stdbool.h in order to get the
declaration of bool. However, will that cause problems on MSVC? Is the
Gallium code compiled on MSVC in general?


No, and yes.





+static inline unsigned list_length(struct list_head *list)
+{
+   unsigned length = 0;
+   for (struct list_head *node = list->next; node != list; node = node->next)
+  length++;
+   return length;
+}


Any reason not to use one of the list iterator macros here? Is it safe
to use a C99-ism outside of a macro in this header? Maybe MSVC
supports this particular C99-ism anyway.


I don't remember off-hand.

-Brian



For what it's worth, I'm strongly in favour of using these kernel-style
lists instead of exec_list. The kernel ones seem much less confusing.

Regards,
- Neil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=AwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=T0t4QG7chq2ZwJo6wilkFznRSFy-8uDKartPGbomVj8&m=AatEjMM7ntWsECW9oVPLk_C3Z0CK7QBIqbXVP_ETF2w&s=TOtSOLlRYSt9tEJikNpITMxBHKDnURqnl6d7RRDfl4w&e=



___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 09/13] util/list: Add list_empty and list_length functions

2015-05-07 Thread Ian Romanick
On 05/05/2015 11:21 AM, Neil Roberts wrote:
> Jason Ekstrand  writes:
> 
>> +static inline bool list_empty(struct list_head *list)
>> +{
>> +   return list->next == list;
>> +}
> 
> It would be good if list.h also included stdbool.h in order to get the
> declaration of bool. However, will that cause problems on MSVC? Is the
> Gallium code compiled on MSVC in general?
> 
>> +static inline unsigned list_length(struct list_head *list)
>> +{
>> +   unsigned length = 0;
>> +   for (struct list_head *node = list->next; node != list; node = 
>> node->next)
>> +  length++;
>> +   return length;
>> +}
> 
> Any reason not to use one of the list iterator macros here? Is it safe
> to use a C99-ism outside of a macro in this header? Maybe MSVC
> supports this particular C99-ism anyway.
> 
> For what it's worth, I'm strongly in favour of using these kernel-style
> lists instead of exec_list. The kernel ones seem much less confusing.

Huh?  They're practically identical.  The only difference is the
kernel-style lists have a single sentinel node, and that node is
impossible to identify "in a crowd."  The exec_lists use two sentinel
nodes, and those nodes have one pointer of overlapping storage (head and
tail are the next and prev pointers of one node, and tail and tail_pred
are the next and prev pointers of the other).  I thought there was some
ASCII art in list.h that showed this, but that appears to not be the case...

This gives some convenience that you can walk through a list from any
node in the list without having a pointer to the list itself.  I don't
know if we still do, but there used to be a few places where we took
advantage of that.

Some of the APIs are (very) poorly named (I'm looking at you,
insert_before), and I'd welcome patches to fix that up.

> Regards,
> - Neil
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev