mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 15:58:05 +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:372e83b95fReviewed-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> (cherry picked from commit6863223033)
This commit is contained in:
parent
9517120528
commit
693b12113d
2 changed files with 10 additions and 11 deletions
|
|
@ -6504,7 +6504,7 @@
|
|||
"description": "util/list: Fix next instruction removal usecase for non safe iterators",
|
||||
"nominated": true,
|
||||
"nomination_type": 2,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "372e83b95f9277fe1d09b1c65c70a38918843b6f",
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -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