summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-10-31 18:12:59 -0700
committerKeith Packard <keithp@keithp.com>2015-01-18 13:56:49 +1300
commit03f0e82d75aa975d86f13b3d62374b10bd9e8cdb (patch)
tree59de0032d494854fe3a729c176507331e927a8b2
parentb6337bcc0fd1435f82b6782637ef0bea0d8d1d62 (diff)
Move reverse list traverse macros from glamor to list.hglamor-pixmaps
Glamor added some macros to traverse lists backwards as a part of its cache management code. Move these to list.h so that they become part of the standard API. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--glamor/glamor_fbo.c12
-rw-r--r--include/list.h37
2 files changed, 37 insertions, 12 deletions
diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 0ba732c25..a2625c9de 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -38,18 +38,6 @@
//#define NO_FBO_CACHE 1
#define FBO_CACHE_THRESHOLD (256*1024*1024)
-/* Loop from the tail to the head. */
-#define xorg_list_for_each_entry_reverse(pos, head, member) \
- for (pos = __container_of((head)->prev, pos, member); \
- &pos->member != (head); \
- pos = __container_of(pos->member.prev, pos, member))
-
-#define xorg_list_for_each_entry_safe_reverse(pos, tmp, head, member) \
- for (pos = __container_of((head)->prev, pos, member), \
- tmp = __container_of(pos->member.prev, pos, member); \
- &pos->member != (head); \
- pos = tmp, tmp = __container_of(pos->member.prev, tmp, member))
-
inline static int
cache_wbucket(int size)
{
diff --git a/include/list.h b/include/list.h
index 39f198590..e79378b1a 100644
--- a/include/list.h
+++ b/include/list.h
@@ -322,6 +322,43 @@ xorg_list_is_empty(struct xorg_list *head)
&pos->member != (head); \
pos = tmp, tmp = __container_of(pos->member.next, tmp, member))
+/**
+ * Loop backwards through the list given by head and set pos to struct
+ * in the list.
+ *
+ * Example:
+ * struct foo *iterator;
+ * xorg_list_for_each_entry_reverse(iterator, &bar->list_of_foos, entry) {
+ * [modify iterator]
+ * }
+ *
+ * This macro is not safe for node deletion. Use
+ * xorg_list_for_each_entry_safe_reverse instead.
+ *
+ * @param pos Iterator variable of the type of the list elements.
+ * @param head List head
+ * @param member Member name of the struct xorg_list in the list elements.
+ *
+ */
+
+#define xorg_list_for_each_entry_reverse(pos, head, member) \
+ for (pos = __container_of((head)->prev, pos, member); \
+ &pos->member != (head); \
+ pos = __container_of(pos->member.prev, pos, member))
+
+/**
+ * Loop backwards through the list, keeping a backup pointer to the
+ * element. This macro allows for the deletion of a list element while
+ * looping through the list.
+ *
+ * See xorg_list_for_each_entry_reverse for more details.
+ */
+#define xorg_list_for_each_entry_safe_reverse(pos, tmp, head, member) \
+ for (pos = __container_of((head)->prev, pos, member), \
+ tmp = __container_of(pos->member.prev, pos, member); \
+ &pos->member != (head); \
+ pos = tmp, tmp = __container_of(pos->member.prev, tmp, member))
+
/* NULL-Terminated List Interface
*
* The interface below does _not_ use the struct xorg_list as described above.