[Mesa-dev] [PATCH 07/13] util: Move gallium's linked list to util

Jason Ekstrand jason at jlekstrand.net
Thu May 7 19:33:27 PDT 2015


On Thu, May 7, 2015 at 5:30 PM, Ian Romanick <idr at freedesktop.org> wrote:
> Isn't this the same as src/util/simple_list.h?

In terms of being a two-pointer circularly linked list, yes.  In terms
of having a decent API, no.

1) Nothing in simple_list is namespaced in any way
2) it's all macros with do-while around them instead of static inlines
3) It assumes that you just put prev and next pointers in the
structure you're putting in the list rather than having a node you
embed.  While this provides the type saftey claimed at the top of
simple_list.h, it requires that, if you want a list of struct foo's,
you to use an entire struct foo as the sentinel instead of a 2 or 3
pointer list structure.
4) Point 3 isn't quite true because there is a simple_node structure.
However, it looks like a complete after-thought because none of the
iterators or manipulators do anything with it.

I could probably extend the list, but I think you get the point.
Sure, I could improve simple_list, but why do so when there's a
perfectly good list in gallium that does everything simple_list does
and more.

I did start working on replacing simple_list with the gallium list to
get us down to two lists, but we use it in things like swrast and tnl
so it turned into quite the spider-web.  Eventually, I'd like to see
simple_list die but if we can at least restrict it back to the older
parts of the code and remove it from util, that would make me happy
enough for now.
--Jason

> On 04/27/2015 09:03 PM, Jason Ekstrand wrote:
>> The linked list in gallium is pretty much the kernel list and we would like
>> to have a C-based linked list for all of mesa.  Let's not duplicate and
>> just steal the gallium one.
>> ---
>>  src/gallium/auxiliary/Makefile.sources             |   1 -
>>  src/gallium/auxiliary/hud/hud_private.h            |   2 +-
>>  .../auxiliary/pipebuffer/pb_buffer_fenced.c        |   2 +-
>>  src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c |   2 +-
>>  src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c |   2 +-
>>  src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c    |   2 +-
>>  src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c  |   2 +-
>>  src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c  |   2 +-
>>  src/gallium/auxiliary/util/u_debug_flush.c         |   2 +-
>>  src/gallium/auxiliary/util/u_debug_memory.c        |   2 +-
>>  src/gallium/auxiliary/util/u_dirty_surfaces.h      |   2 +-
>>  src/gallium/auxiliary/util/u_double_list.h         | 146 ---------------------
>>  src/gallium/drivers/freedreno/freedreno_context.h  |   2 +-
>>  src/gallium/drivers/freedreno/freedreno_query_hw.h |   2 +-
>>  src/gallium/drivers/freedreno/freedreno_resource.h |   2 +-
>>  src/gallium/drivers/ilo/ilo_common.h               |   2 +-
>>  src/gallium/drivers/nouveau/nouveau_buffer.h       |   2 +-
>>  src/gallium/drivers/nouveau/nouveau_fence.c        |   2 -
>>  src/gallium/drivers/nouveau/nouveau_fence.h        |   2 +-
>>  src/gallium/drivers/nouveau/nouveau_mm.c           |   2 +-
>>  src/gallium/drivers/nouveau/nv30/nv30_screen.h     |   2 +-
>>  src/gallium/drivers/nouveau/nv50/nv50_resource.h   |   2 +-
>>  src/gallium/drivers/r600/compute_memory_pool.c     |   2 +-
>>  src/gallium/drivers/r600/evergreen_compute.c       |   2 +-
>>  src/gallium/drivers/r600/r600_llvm.c               |   2 +-
>>  src/gallium/drivers/r600/r600_pipe.h               |   2 +-
>>  src/gallium/drivers/radeon/r600_pipe_common.h      |   2 +-
>>  src/gallium/drivers/radeon/radeon_vce.h            |   2 +-
>>  src/gallium/drivers/svga/svga_context.h            |   2 +-
>>  src/gallium/drivers/svga/svga_resource_buffer.h    |   2 -
>>  .../drivers/svga/svga_resource_buffer_upload.c     |   1 -
>>  src/gallium/drivers/svga/svga_screen_cache.h       |   2 +-
>>  src/gallium/state_trackers/nine/basetexture9.h     |   2 +-
>>  src/gallium/state_trackers/nine/device9.h          |   2 +-
>>  src/gallium/state_trackers/nine/nine_state.h       |   2 +-
>>  src/gallium/state_trackers/nine/surface9.h         |   2 +-
>>  src/gallium/state_trackers/omx/vid_dec.h           |   2 +-
>>  src/gallium/state_trackers/omx/vid_enc.h           |   2 +-
>>  src/gallium/winsys/radeon/drm/radeon_drm_bo.c      |   2 +-
>>  .../winsys/svga/drm/pb_buffer_simple_fenced.c      |   2 +-
>>  src/gallium/winsys/svga/drm/vmw_fence.c            |   2 +-
>>  src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c  |   2 +-
>>  src/util/Makefile.sources                          |   1 +
>>  src/util/list.h                                    | 146 +++++++++++++++++++++
>>  44 files changed, 184 insertions(+), 189 deletions(-)
>>  delete mode 100644 src/gallium/auxiliary/util/u_double_list.h
>>  create mode 100644 src/util/list.h
>>
>> diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources
>> index ec7547c..62e6b94 100644
>> --- a/src/gallium/auxiliary/Makefile.sources
>> +++ b/src/gallium/auxiliary/Makefile.sources
>> @@ -197,7 +197,6 @@ C_SOURCES := \
>>       util/u_dirty_surfaces.h \
>>       util/u_dl.c \
>>       util/u_dl.h \
>> -     util/u_double_list.h \
>>       util/u_draw.c \
>>       util/u_draw.h \
>>       util/u_draw_quad.c \
>> diff --git a/src/gallium/auxiliary/hud/hud_private.h b/src/gallium/auxiliary/hud/hud_private.h
>> index 1606ada..c74dc3b 100644
>> --- a/src/gallium/auxiliary/hud/hud_private.h
>> +++ b/src/gallium/auxiliary/hud/hud_private.h
>> @@ -29,7 +29,7 @@
>>  #define HUD_PRIVATE_H
>>
>>  #include "pipe/p_context.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  struct hud_graph {
>>     /* initialized by common code */
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
>> index 9e0cace..7840467 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
>> @@ -46,7 +46,7 @@
>>  #include "util/u_debug.h"
>>  #include "os/os_thread.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "pb_buffer.h"
>>  #include "pb_buffer_fenced.h"
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
>> index 5eb8d06..5023687 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
>> @@ -38,7 +38,7 @@
>>  #include "util/u_debug.h"
>>  #include "os/os_thread.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_time.h"
>>
>>  #include "pb_buffer.h"
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c
>> index e5d8118..6236afb 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c
>> @@ -38,7 +38,7 @@
>>  #include "os/os_thread.h"
>>  #include "util/u_math.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_time.h"
>>  #include "util/u_debug_stack.h"
>>
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c
>> index aa98907..84eb6ed 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c
>> @@ -37,7 +37,7 @@
>>  #include "util/u_debug.h"
>>  #include "os/os_thread.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_mm.h"
>>  #include "pb_buffer.h"
>>  #include "pb_bufmgr.h"
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c
>> index f2ff2d8..51525b0 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c
>> @@ -40,7 +40,7 @@
>>  #include "os/os_thread.h"
>>  #include "pipe/p_defines.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "pb_buffer.h"
>>  #include "pb_bufmgr.h"
>> diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c
>> index 00a1dee..6a62b4f 100644
>> --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c
>> +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c
>> @@ -41,7 +41,7 @@
>>  #include "os/os_thread.h"
>>  #include "pipe/p_defines.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_time.h"
>>
>>  #include "pb_buffer.h"
>> diff --git a/src/gallium/auxiliary/util/u_debug_flush.c b/src/gallium/auxiliary/util/u_debug_flush.c
>> index cdefca2..52e72cd 100644
>> --- a/src/gallium/auxiliary/util/u_debug_flush.c
>> +++ b/src/gallium/auxiliary/util/u_debug_flush.c
>> @@ -44,7 +44,7 @@
>>  #include "util/u_memory.h"
>>  #include "util/u_debug_flush.h"
>>  #include "util/u_hash_table.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_inlines.h"
>>  #include "util/u_string.h"
>>  #include "os/os_thread.h"
>> diff --git a/src/gallium/auxiliary/util/u_debug_memory.c b/src/gallium/auxiliary/util/u_debug_memory.c
>> index 1ad0e72..747837c 100644
>> --- a/src/gallium/auxiliary/util/u_debug_memory.c
>> +++ b/src/gallium/auxiliary/util/u_debug_memory.c
>> @@ -42,7 +42,7 @@
>>
>>  #include "util/u_debug.h"
>>  #include "util/u_debug_stack.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>
>>  #define DEBUG_MEMORY_MAGIC 0x6e34090aU
>> diff --git a/src/gallium/auxiliary/util/u_dirty_surfaces.h b/src/gallium/auxiliary/util/u_dirty_surfaces.h
>> index f3618d9..d31f8b9 100644
>> --- a/src/gallium/auxiliary/util/u_dirty_surfaces.h
>> +++ b/src/gallium/auxiliary/util/u_dirty_surfaces.h
>> @@ -29,7 +29,7 @@
>>
>>  #include "pipe/p_state.h"
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_math.h"
>>
>>  struct pipe_context;
>> diff --git a/src/gallium/auxiliary/util/u_double_list.h b/src/gallium/auxiliary/util/u_double_list.h
>> deleted file mode 100644
>> index e808333..0000000
>> --- a/src/gallium/auxiliary/util/u_double_list.h
>> +++ /dev/null
>> @@ -1,146 +0,0 @@
>> -/**************************************************************************
>> - *
>> - * Copyright 2006 VMware, Inc., Bismarck, ND. USA.
>> - * All Rights Reserved.
>> - *
>> - * Permission is hereby granted, free of charge, to any person obtaining a
>> - * copy of this software and associated documentation files (the
>> - * "Software"), to deal in the Software without restriction, including
>> - * without limitation the rights to use, copy, modify, merge, publish,
>> - * distribute, sub license, and/or sell copies of the Software, and to
>> - * permit persons to whom the Software is furnished to do so, subject to
>> - * the following conditions:
>> - *
>> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
>> - * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
>> - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
>> - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
>> - * USE OR OTHER DEALINGS IN THE SOFTWARE.
>> - *
>> - * The above copyright notice and this permission notice (including the
>> - * next paragraph) shall be included in all copies or substantial portions
>> - * of the Software.
>> - *
>> - **************************************************************************/
>> -
>> -/**
>> - * \file
>> - * List macros heavily inspired by the Linux kernel
>> - * list handling. No list looping yet.
>> - *
>> - * Is not threadsafe, so common operations need to
>> - * be protected using an external mutex.
>> - */
>> -
>> -#ifndef _U_DOUBLE_LIST_H_
>> -#define _U_DOUBLE_LIST_H_
>> -
>> -
>> -#include <stddef.h>
>> -
>> -
>> -struct list_head
>> -{
>> -    struct list_head *prev;
>> -    struct list_head *next;
>> -};
>> -
>> -static inline void list_inithead(struct list_head *item)
>> -{
>> -    item->prev = item;
>> -    item->next = item;
>> -}
>> -
>> -static inline void list_add(struct list_head *item, struct list_head *list)
>> -{
>> -    item->prev = list;
>> -    item->next = list->next;
>> -    list->next->prev = item;
>> -    list->next = item;
>> -}
>> -
>> -static inline void list_addtail(struct list_head *item, struct list_head *list)
>> -{
>> -    item->next = list;
>> -    item->prev = list->prev;
>> -    list->prev->next = item;
>> -    list->prev = item;
>> -}
>> -
>> -static inline void list_replace(struct list_head *from, struct list_head *to)
>> -{
>> -    to->prev = from->prev;
>> -    to->next = from->next;
>> -    from->next->prev = to;
>> -    from->prev->next = to;
>> -}
>> -
>> -static inline void list_del(struct list_head *item)
>> -{
>> -    item->prev->next = item->next;
>> -    item->next->prev = item->prev;
>> -    item->prev = item->next = NULL;
>> -}
>> -
>> -static inline void list_delinit(struct list_head *item)
>> -{
>> -    item->prev->next = item->next;
>> -    item->next->prev = item->prev;
>> -    item->next = item;
>> -    item->prev = item;
>> -}
>> -
>> -#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)
>> -#define LIST_REPLACE(__from, __to) list_replace(__from, __to)
>> -#define LIST_DEL(__item) list_del(__item)
>> -#define LIST_DELINIT(__item) list_delinit(__item)
>> -
>> -#define LIST_ENTRY(__type, __item, __field)   \
>> -    ((__type *)(((char *)(__item)) - offsetof(__type, __field)))
>> -
>> -#define LIST_IS_EMPTY(__list)                   \
>> -    ((__list)->next == (__list))
>> -
>> -/**
>> - * Cast from a pointer to a member of a struct back to the containing struct.
>> - *
>> - * 'sample' MUST be initialized, or else the result is undefined!
>> - */
>> -#ifndef container_of
>> -#define container_of(ptr, sample, member)                            \
>> -    (void *)((char *)(ptr)                                           \
>> -          - ((char *)&(sample)->member - (char *)(sample)))
>> -#endif
>> -
>> -#define LIST_FOR_EACH_ENTRY(pos, head, member)                               \
>> -   for (pos = NULL, pos = container_of((head)->next, pos, member);   \
>> -     &pos->member != (head);                                         \
>> -     pos = container_of(pos->member.next, pos, member))
>> -
>> -#define LIST_FOR_EACH_ENTRY_SAFE(pos, storage, head, member) \
>> -   for (pos = NULL, pos = container_of((head)->next, pos, member),   \
>> -     storage = container_of(pos->member.next, pos, member);  \
>> -     &pos->member != (head);                                         \
>> -     pos = storage, storage = container_of(storage->member.next, storage, member))
>> -
>> -#define LIST_FOR_EACH_ENTRY_SAFE_REV(pos, storage, head, member)     \
>> -   for (pos = NULL, pos = container_of((head)->prev, pos, member),   \
>> -     storage = container_of(pos->member.prev, pos, member);          \
>> -     &pos->member != (head);                                         \
>> -     pos = storage, storage = container_of(storage->member.prev, storage, member))
>> -
>> -#define LIST_FOR_EACH_ENTRY_FROM(pos, start, head, member)           \
>> -   for (pos = NULL, pos = container_of((start), pos, member);                \
>> -     &pos->member != (head);                                         \
>> -     pos = container_of(pos->member.next, pos, member))
>> -
>> -#define LIST_FOR_EACH_ENTRY_FROM_REV(pos, start, head, member)               \
>> -   for (pos = NULL, pos = container_of((start), pos, member);                \
>> -     &pos->member != (head);                                         \
>> -     pos = container_of(pos->member.prev, pos, member))
>> -
>> -#endif /*_U_DOUBLE_LIST_H_*/
>> diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h
>> index a648689..1014c7b 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_context.h
>> +++ b/src/gallium/drivers/freedreno/freedreno_context.h
>> @@ -32,7 +32,7 @@
>>  #include "pipe/p_context.h"
>>  #include "indices/u_primconvert.h"
>>  #include "util/u_blitter.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_slab.h"
>>  #include "util/u_string.h"
>>
>> diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.h b/src/gallium/drivers/freedreno/freedreno_query_hw.h
>> index 62baa3a..8f4b1f5 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_query_hw.h
>> +++ b/src/gallium/drivers/freedreno/freedreno_query_hw.h
>> @@ -29,7 +29,7 @@
>>  #ifndef FREEDRENO_QUERY_HW_H_
>>  #define FREEDRENO_QUERY_HW_H_
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "freedreno_query.h"
>>  #include "freedreno_context.h"
>> diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
>> index a2a540c..36580a3 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_resource.h
>> +++ b/src/gallium/drivers/freedreno/freedreno_resource.h
>> @@ -29,7 +29,7 @@
>>  #ifndef FREEDRENO_RESOURCE_H_
>>  #define FREEDRENO_RESOURCE_H_
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_range.h"
>>  #include "util/u_transfer.h"
>>
>> diff --git a/src/gallium/drivers/ilo/ilo_common.h b/src/gallium/drivers/ilo/ilo_common.h
>> index 1ed964f..85ca502 100644
>> --- a/src/gallium/drivers/ilo/ilo_common.h
>> +++ b/src/gallium/drivers/ilo/ilo_common.h
>> @@ -33,7 +33,7 @@
>>  #include "pipe/p_format.h"
>>
>>  #include "util/u_debug.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_format.h"
>>  #include "util/u_inlines.h"
>>  #include "util/u_math.h"
>> diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.h b/src/gallium/drivers/nouveau/nouveau_buffer.h
>> index f881adc..de77f48 100644
>> --- a/src/gallium/drivers/nouveau/nouveau_buffer.h
>> +++ b/src/gallium/drivers/nouveau/nouveau_buffer.h
>> @@ -3,7 +3,7 @@
>>
>>  #include "util/u_range.h"
>>  #include "util/u_transfer.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  struct pipe_resource;
>>  struct nouveau_context;
>> diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c
>> index a9448a4..17a5174 100644
>> --- a/src/gallium/drivers/nouveau/nouveau_fence.c
>> +++ b/src/gallium/drivers/nouveau/nouveau_fence.c
>> @@ -20,8 +20,6 @@
>>   * OTHER DEALINGS IN THE SOFTWARE.
>>   */
>>
>> -#include "util/u_double_list.h"
>> -
>>  #include "nouveau_screen.h"
>>  #include "nouveau_winsys.h"
>>  #include "nouveau_fence.h"
>> diff --git a/src/gallium/drivers/nouveau/nouveau_fence.h b/src/gallium/drivers/nouveau/nouveau_fence.h
>> index 3984a9a..7bb132a 100644
>> --- a/src/gallium/drivers/nouveau/nouveau_fence.h
>> +++ b/src/gallium/drivers/nouveau/nouveau_fence.h
>> @@ -3,7 +3,7 @@
>>  #define __NOUVEAU_FENCE_H__
>>
>>  #include "util/u_inlines.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #define NOUVEAU_FENCE_STATE_AVAILABLE 0
>>  #define NOUVEAU_FENCE_STATE_EMITTING  1
>> diff --git a/src/gallium/drivers/nouveau/nouveau_mm.c b/src/gallium/drivers/nouveau/nouveau_mm.c
>> index 87f2f46..9c454c5 100644
>> --- a/src/gallium/drivers/nouveau/nouveau_mm.c
>> +++ b/src/gallium/drivers/nouveau/nouveau_mm.c
>> @@ -3,7 +3,7 @@
>>
>>  #include "util/u_inlines.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "nouveau_winsys.h"
>>  #include "nouveau_screen.h"
>> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.h b/src/gallium/drivers/nouveau/nv30/nv30_screen.h
>> index 0b3bbbb..3f2e47f 100644
>> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.h
>> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.h
>> @@ -3,7 +3,7 @@
>>
>>  #include <stdio.h>
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "nouveau_debug.h"
>>  #include "nouveau_screen.h"
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_resource.h b/src/gallium/drivers/nouveau/nv50/nv50_resource.h
>> index 36d70d8..f7ee135 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_resource.h
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_resource.h
>> @@ -3,7 +3,7 @@
>>  #define __NV50_RESOURCE_H__
>>
>>  #include "util/u_transfer.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "nouveau_winsys.h"
>>  #include "nouveau_buffer.h"
>> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
>> index 30b77a4..413aa3d 100644
>> --- a/src/gallium/drivers/r600/compute_memory_pool.c
>> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
>> @@ -26,7 +26,7 @@
>>  #include "pipe/p_state.h"
>>  #include "pipe/p_context.h"
>>  #include "util/u_blitter.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_transfer.h"
>>  #include "util/u_surface.h"
>>  #include "util/u_pack_color.h"
>> diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
>> index 90fdd79..4c3c34c 100644
>> --- a/src/gallium/drivers/r600/evergreen_compute.c
>> +++ b/src/gallium/drivers/r600/evergreen_compute.c
>> @@ -30,7 +30,7 @@
>>  #include "pipe/p_state.h"
>>  #include "pipe/p_context.h"
>>  #include "util/u_blitter.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_transfer.h"
>>  #include "util/u_surface.h"
>>  #include "util/u_pack_color.h"
>> diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
>> index af46044..72e2dc4 100644
>> --- a/src/gallium/drivers/r600/r600_llvm.c
>> +++ b/src/gallium/drivers/r600/r600_llvm.c
>> @@ -4,7 +4,7 @@
>>  #include "gallivm/lp_bld_intr.h"
>>  #include "gallivm/lp_bld_gather.h"
>>  #include "tgsi/tgsi_parse.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_memory.h"
>>
>>  #include "evergreend.h"
>> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
>> index ac69895..4ea270d 100644
>> --- a/src/gallium/drivers/r600/r600_pipe.h
>> +++ b/src/gallium/drivers/r600/r600_pipe.h
>> @@ -33,7 +33,7 @@
>>  #include "r600_public.h"
>>
>>  #include "util/u_suballoc.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_transfer.h"
>>
>>  #define R600_NUM_ATOMS 73
>> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
>> index febd2a1..b3c6485 100644
>> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
>> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
>> @@ -37,7 +37,7 @@
>>  #include "radeon/drm/radeon_winsys.h"
>>
>>  #include "util/u_blitter.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_range.h"
>>  #include "util/u_slab.h"
>>  #include "util/u_suballoc.h"
>> diff --git a/src/gallium/drivers/radeon/radeon_vce.h b/src/gallium/drivers/radeon/radeon_vce.h
>> index 7f0cd1f..d0b205c 100644
>> --- a/src/gallium/drivers/radeon/radeon_vce.h
>> +++ b/src/gallium/drivers/radeon/radeon_vce.h
>> @@ -34,7 +34,7 @@
>>  #ifndef RADEON_VCE_H
>>  #define RADEON_VCE_H
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #define RVCE_RELOC(buf, usage, domain) (enc->ws->cs_add_reloc(enc->cs, (buf), (usage), domain, RADEON_PRIO_MIN))
>>
>> diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h
>> index a75f2a8..630f5f7 100644
>> --- a/src/gallium/drivers/svga/svga_context.h
>> +++ b/src/gallium/drivers/svga/svga_context.h
>> @@ -32,7 +32,7 @@
>>  #include "pipe/p_state.h"
>>
>>  #include "util/u_blitter.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "tgsi/tgsi_scan.h"
>>
>> diff --git a/src/gallium/drivers/svga/svga_resource_buffer.h b/src/gallium/drivers/svga/svga_resource_buffer.h
>> index 36467cf..83b3d34 100644
>> --- a/src/gallium/drivers/svga/svga_resource_buffer.h
>> +++ b/src/gallium/drivers/svga/svga_resource_buffer.h
>> @@ -31,8 +31,6 @@
>>  #include "pipe/p_state.h"
>>  #include "util/u_transfer.h"
>>
>> -#include "util/u_double_list.h"
>> -
>>  #include "svga_screen_cache.h"
>>  #include "svga_screen.h"
>>  #include "svga_cmd.h"
>> diff --git a/src/gallium/drivers/svga/svga_resource_buffer_upload.c b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
>> index 3fc14f8..5686531 100644
>> --- a/src/gallium/drivers/svga/svga_resource_buffer_upload.c
>> +++ b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
>> @@ -30,7 +30,6 @@
>>  #include "util/u_inlines.h"
>>  #include "util/u_math.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>>
>>  #include "svga_cmd.h"
>>  #include "svga_context.h"
>> diff --git a/src/gallium/drivers/svga/svga_screen_cache.h b/src/gallium/drivers/svga/svga_screen_cache.h
>> index 96e1e9c..56ac62b 100644
>> --- a/src/gallium/drivers/svga/svga_screen_cache.h
>> +++ b/src/gallium/drivers/svga/svga_screen_cache.h
>> @@ -34,7 +34,7 @@
>>
>>  #include "os/os_thread.h"
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>
>>  /* Guess the storage size of cached surfaces and try and keep it under
>> diff --git a/src/gallium/state_trackers/nine/basetexture9.h b/src/gallium/state_trackers/nine/basetexture9.h
>> index 0062771..2541c9b 100644
>> --- a/src/gallium/state_trackers/nine/basetexture9.h
>> +++ b/src/gallium/state_trackers/nine/basetexture9.h
>> @@ -25,7 +25,7 @@
>>
>>  #include "resource9.h"
>>  #include "util/u_inlines.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  struct NineBaseTexture9
>>  {
>> diff --git a/src/gallium/state_trackers/nine/device9.h b/src/gallium/state_trackers/nine/device9.h
>> index f412088..b4ff2ad 100644
>> --- a/src/gallium/state_trackers/nine/device9.h
>> +++ b/src/gallium/state_trackers/nine/device9.h
>> @@ -42,7 +42,7 @@ struct u_upload_mgr;
>>  struct NineSwapChain9;
>>  struct NineStateBlock9;
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  struct NineDevice9
>>  {
>> diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
>> index 1916959..2bf3f63 100644
>> --- a/src/gallium/state_trackers/nine/nine_state.h
>> +++ b/src/gallium/state_trackers/nine/nine_state.h
>> @@ -26,7 +26,7 @@
>>  #include "d3d9.h"
>>  #include "nine_defines.h"
>>  #include "pipe/p_state.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #define NINED3DSAMP_MINLOD (D3DSAMP_DMAPOFFSET + 1)
>>  #define NINED3DSAMP_SHADOW (D3DSAMP_DMAPOFFSET + 2)
>> diff --git a/src/gallium/state_trackers/nine/surface9.h b/src/gallium/state_trackers/nine/surface9.h
>> index 32e1722..8695eae 100644
>> --- a/src/gallium/state_trackers/nine/surface9.h
>> +++ b/src/gallium/state_trackers/nine/surface9.h
>> @@ -26,7 +26,7 @@
>>  #include "resource9.h"
>>
>>  #include "pipe/p_state.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "util/u_rect.h"
>>  #include "util/u_inlines.h"
>>
>> diff --git a/src/gallium/state_trackers/omx/vid_dec.h b/src/gallium/state_trackers/omx/vid_dec.h
>> index 9acf872..4585ff6 100644
>> --- a/src/gallium/state_trackers/omx/vid_dec.h
>> +++ b/src/gallium/state_trackers/omx/vid_dec.h
>> @@ -48,7 +48,7 @@
>>  #include "pipe/p_video_state.h"
>>  #include "state_tracker/drm_driver.h"
>>  #include "os/os_thread.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #define OMX_VID_DEC_BASE_NAME "OMX.mesa.video_decoder"
>>
>> diff --git a/src/gallium/state_trackers/omx/vid_enc.h b/src/gallium/state_trackers/omx/vid_enc.h
>> index ca6ee91..c8d192b 100644
>> --- a/src/gallium/state_trackers/omx/vid_enc.h
>> +++ b/src/gallium/state_trackers/omx/vid_enc.h
>> @@ -41,7 +41,7 @@
>>  #include <bellagio/st_static_component_loader.h>
>>  #include <bellagio/omx_base_filter.h>
>>
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "vl/vl_defines.h"
>>  #include "vl/vl_compositor.h"
>> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
>> index e609d68..7fff1f4 100644
>> --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
>> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
>> @@ -29,7 +29,7 @@
>>  #include "util/u_hash_table.h"
>>  #include "util/u_memory.h"
>>  #include "util/simple_list.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "os/os_thread.h"
>>  #include "os/os_mman.h"
>>  #include "os/os_time.h"
>> diff --git a/src/gallium/winsys/svga/drm/pb_buffer_simple_fenced.c b/src/gallium/winsys/svga/drm/pb_buffer_simple_fenced.c
>> index 888aebb..16eb751 100644
>> --- a/src/gallium/winsys/svga/drm/pb_buffer_simple_fenced.c
>> +++ b/src/gallium/winsys/svga/drm/pb_buffer_simple_fenced.c
>> @@ -46,7 +46,7 @@
>>  #include "util/u_debug.h"
>>  #include "os/os_thread.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "pipebuffer/pb_buffer.h"
>>  #include "pipebuffer/pb_bufmgr.h"
>> diff --git a/src/gallium/winsys/svga/drm/vmw_fence.c b/src/gallium/winsys/svga/drm/vmw_fence.c
>> index 8af2250..1b24239 100644
>> --- a/src/gallium/winsys/svga/drm/vmw_fence.c
>> +++ b/src/gallium/winsys/svga/drm/vmw_fence.c
>> @@ -24,7 +24,7 @@
>>   **********************************************************/
>>  #include "util/u_memory.h"
>>  #include "util/u_atomic.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>  #include "os/os_thread.h"
>>
>>  #include "pipebuffer/pb_buffer_fenced.h"
>> diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>> index e61a173..740b920 100644
>> --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>> +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>> @@ -47,7 +47,7 @@
>>  #include "util/u_format.h"
>>  #include "util/u_math.h"
>>  #include "util/u_memory.h"
>> -#include "util/u_double_list.h"
>> +#include "util/list.h"
>>
>>  #include "state_tracker/sw_winsys.h"
>>  #include "state_tracker/drm_driver.h"
>> diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
>> index 3e0d02b..dc55939 100644
>> --- a/src/util/Makefile.sources
>> +++ b/src/util/Makefile.sources
>> @@ -7,6 +7,7 @@ MESA_UTIL_FILES :=    \
>>       format_srgb.h \
>>       hash_table.c    \
>>       hash_table.h \
>> +     list.h \
>>       macros.h \
>>       ralloc.c \
>>       ralloc.h \
>> diff --git a/src/util/list.h b/src/util/list.h
>> new file mode 100644
>> index 0000000..9dcf671
>> --- /dev/null
>> +++ b/src/util/list.h
>> @@ -0,0 +1,146 @@
>> +/**************************************************************************
>> + *
>> + * Copyright 2006 VMware, Inc., Bismarck, ND. USA.
>> + * All Rights Reserved.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the
>> + * "Software"), to deal in the Software without restriction, including
>> + * without limitation the rights to use, copy, modify, merge, publish,
>> + * distribute, sub license, and/or sell copies of the Software, and to
>> + * permit persons to whom the Software is furnished to do so, subject to
>> + * the following conditions:
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
>> + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
>> + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
>> + * USE OR OTHER DEALINGS IN THE SOFTWARE.
>> + *
>> + * The above copyright notice and this permission notice (including the
>> + * next paragraph) shall be included in all copies or substantial portions
>> + * of the Software.
>> + *
>> + **************************************************************************/
>> +
>> +/**
>> + * \file
>> + * List macros heavily inspired by the Linux kernel
>> + * list handling. No list looping yet.
>> + *
>> + * Is not threadsafe, so common operations need to
>> + * be protected using an external mutex.
>> + */
>> +
>> +#ifndef _UTIL_LIST_H_
>> +#define _UTIL_LIST_H_
>> +
>> +
>> +#include <stddef.h>
>> +
>> +
>> +struct list_head
>> +{
>> +    struct list_head *prev;
>> +    struct list_head *next;
>> +};
>> +
>> +static inline void list_inithead(struct list_head *item)
>> +{
>> +    item->prev = item;
>> +    item->next = item;
>> +}
>> +
>> +static inline void list_add(struct list_head *item, struct list_head *list)
>> +{
>> +    item->prev = list;
>> +    item->next = list->next;
>> +    list->next->prev = item;
>> +    list->next = item;
>> +}
>> +
>> +static inline void list_addtail(struct list_head *item, struct list_head *list)
>> +{
>> +    item->next = list;
>> +    item->prev = list->prev;
>> +    list->prev->next = item;
>> +    list->prev = item;
>> +}
>> +
>> +static inline void list_replace(struct list_head *from, struct list_head *to)
>> +{
>> +    to->prev = from->prev;
>> +    to->next = from->next;
>> +    from->next->prev = to;
>> +    from->prev->next = to;
>> +}
>> +
>> +static inline void list_del(struct list_head *item)
>> +{
>> +    item->prev->next = item->next;
>> +    item->next->prev = item->prev;
>> +    item->prev = item->next = NULL;
>> +}
>> +
>> +static inline void list_delinit(struct list_head *item)
>> +{
>> +    item->prev->next = item->next;
>> +    item->next->prev = item->prev;
>> +    item->next = item;
>> +    item->prev = item;
>> +}
>> +
>> +#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)
>> +#define LIST_REPLACE(__from, __to) list_replace(__from, __to)
>> +#define LIST_DEL(__item) list_del(__item)
>> +#define LIST_DELINIT(__item) list_delinit(__item)
>> +
>> +#define LIST_ENTRY(__type, __item, __field)   \
>> +    ((__type *)(((char *)(__item)) - offsetof(__type, __field)))
>> +
>> +#define LIST_IS_EMPTY(__list)                   \
>> +    ((__list)->next == (__list))
>> +
>> +/**
>> + * Cast from a pointer to a member of a struct back to the containing struct.
>> + *
>> + * 'sample' MUST be initialized, or else the result is undefined!
>> + */
>> +#ifndef container_of
>> +#define container_of(ptr, sample, member)                            \
>> +    (void *)((char *)(ptr)                                           \
>> +          - ((char *)&(sample)->member - (char *)(sample)))
>> +#endif
>> +
>> +#define LIST_FOR_EACH_ENTRY(pos, head, member)                               \
>> +   for (pos = NULL, pos = container_of((head)->next, pos, member);   \
>> +     &pos->member != (head);                                         \
>> +     pos = container_of(pos->member.next, pos, member))
>> +
>> +#define LIST_FOR_EACH_ENTRY_SAFE(pos, storage, head, member) \
>> +   for (pos = NULL, pos = container_of((head)->next, pos, member),   \
>> +     storage = container_of(pos->member.next, pos, member);  \
>> +     &pos->member != (head);                                         \
>> +     pos = storage, storage = container_of(storage->member.next, storage, member))
>> +
>> +#define LIST_FOR_EACH_ENTRY_SAFE_REV(pos, storage, head, member)     \
>> +   for (pos = NULL, pos = container_of((head)->prev, pos, member),   \
>> +     storage = container_of(pos->member.prev, pos, member);          \
>> +     &pos->member != (head);                                         \
>> +     pos = storage, storage = container_of(storage->member.prev, storage, member))
>> +
>> +#define LIST_FOR_EACH_ENTRY_FROM(pos, start, head, member)           \
>> +   for (pos = NULL, pos = container_of((start), pos, member);                \
>> +     &pos->member != (head);                                         \
>> +     pos = container_of(pos->member.next, pos, member))
>> +
>> +#define LIST_FOR_EACH_ENTRY_FROM_REV(pos, start, head, member)               \
>> +   for (pos = NULL, pos = container_of((start), pos, member);                \
>> +     &pos->member != (head);                                         \
>> +     pos = container_of(pos->member.prev, pos, member))
>> +
>> +#endif /*_UTIL_LIST_H_*/
>>
>


More information about the mesa-dev mailing list