[Mesa-dev] [PATCH] glsl/list: make nodes safe for double removal, etc.
Rob Clark
robdclark at gmail.com
Mon Apr 4 15:04:21 UTC 2016
On Mon, Apr 4, 2016 at 10:34 AM, Iago Toral <itoral at igalia.com> wrote:
> On Sat, 2016-04-02 at 17:09 -0400, Rob Clark wrote:
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> It's no extra overhead to do a _self_link() and it eliminates a class of
>> potential problems.
>
> it can also hide actual programming mistakes that would otherwise be
> immediately visible... does this actually help something specific?
Well, basically it avoids needing to explicitly do a _self_link()
after removing a node in cases where you know (for example) that you
might end up removing multiple times. The kernel list implementation
does have separate list_del() and list_del_init(), which would be a
different possible way to go.
But in my experience the programming mistakes that this would hide are
simply cases where you wanted to do list_del_init() instead of
list_del(), so I'm curious about which other cases you are worried
about.
Anyways, this patch doesn't solve something in particular, it is
mostly just a response to a comment Jason made about my usage of
immediate _self_link() after removal on another patch.
BR,
-R
> Iago
>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> Dared-by: Jason Ekstrand <jason at jlekstrand.net>
>> ---
>> src/compiler/glsl/list.h | 15 +++++++--------
>> 1 file changed, 7 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/compiler/glsl/list.h b/src/compiler/glsl/list.h
>> index a1c4d82..77e1f67 100644
>> --- a/src/compiler/glsl/list.h
>> +++ b/src/compiler/glsl/list.h
>> @@ -165,19 +165,18 @@ exec_node_get_prev(struct exec_node *n)
>> }
>>
>> static inline void
>> -exec_node_remove(struct exec_node *n)
>> +exec_node_self_link(struct exec_node *n)
>> {
>> - n->next->prev = n->prev;
>> - n->prev->next = n->next;
>> - n->next = NULL;
>> - n->prev = NULL;
>> + n->next = n;
>> + n->prev = n;
>> }
>>
>> static inline void
>> -exec_node_self_link(struct exec_node *n)
>> +exec_node_remove(struct exec_node *n)
>> {
>> - n->next = n;
>> - n->prev = n;
>> + n->next->prev = n->prev;
>> + n->prev->next = n->next;
>> + exec_node_self_link(n);
>> }
>>
>> static inline void
>
>
More information about the mesa-dev
mailing list