mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
util/list: Fix next instruction removal usecase for non safe iterators
Introducing this iterator debug information breaks the usecase of removing
elements in the list other than the current element.
Fixes: 372e83b95f
Reviewed-by: Rob Clark <rob.clark@oss.qualcomm.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37061>
This commit is contained in:
parent
c739d836f7
commit
6863223033
1 changed files with 9 additions and 10 deletions
|
|
@ -44,6 +44,9 @@
|
|||
|
||||
#define list_assert(cond, msg) assert(cond && msg)
|
||||
|
||||
#define list_validate_iter(item, msg) \
|
||||
list_assert(list_is_linked(item) && !list_is_empty(item), msg)
|
||||
|
||||
struct list_head
|
||||
{
|
||||
struct list_head *prev;
|
||||
|
|
@ -234,12 +237,10 @@ static inline void list_move_to(struct list_head *item, struct list_head *loc) {
|
|||
pos = list_container_of(pos->member.prev, pos, member))
|
||||
|
||||
#define list_for_each_entry(type, pos, head, member) \
|
||||
for (type *pos = list_entry((head)->next, type, member), \
|
||||
*__next = list_entry(pos->member.next, type, member); \
|
||||
for (type *pos = list_entry((head)->next, type, member); \
|
||||
&pos->member != (head); \
|
||||
pos = list_entry(pos->member.next, type, member), \
|
||||
list_assert(pos == __next, "use _safe iterator"), \
|
||||
__next = list_entry(__next->member.next, type, member))
|
||||
list_validate_iter(&pos->member, "use _safe iterator"), \
|
||||
pos = list_entry(pos->member.next, type, member))
|
||||
|
||||
#define list_for_each_entry_safe(type, pos, head, member) \
|
||||
for (type *pos = list_entry((head)->next, type, member), \
|
||||
|
|
@ -249,12 +250,10 @@ static inline void list_move_to(struct list_head *item, struct list_head *loc) {
|
|||
__next = list_entry(__next->member.next, type, member))
|
||||
|
||||
#define list_for_each_entry_rev(type, pos, head, member) \
|
||||
for (type *pos = list_entry((head)->prev, type, member), \
|
||||
*__prev = list_entry(pos->member.prev, type, member); \
|
||||
for (type *pos = list_entry((head)->prev, type, member); \
|
||||
&pos->member != (head); \
|
||||
pos = list_entry(pos->member.prev, type, member), \
|
||||
list_assert(pos == __prev, "use _safe iterator"), \
|
||||
__prev = list_entry(__prev->member.prev, type, member))
|
||||
list_validate_iter(&pos->member, "use _safe iterator"), \
|
||||
pos = list_entry(pos->member.prev, type, member))
|
||||
|
||||
#define list_for_each_entry_safe_rev(type, pos, head, member) \
|
||||
for (type *pos = list_entry((head)->prev, type, member), \
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue