diff options
author | Keith Packard <keithp@keithp.com> | 2014-10-31 18:12:59 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2015-01-18 13:56:49 +1300 |
commit | 03f0e82d75aa975d86f13b3d62374b10bd9e8cdb (patch) | |
tree | 59de0032d494854fe3a729c176507331e927a8b2 | |
parent | b6337bcc0fd1435f82b6782637ef0bea0d8d1d62 (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.c | 12 | ||||
-rw-r--r-- | include/list.h | 37 |
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. |