mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 17:40:11 +01:00
list: add some iterator debug
Debugging use of unsafe iterators when you should have used the _safe version sucks. Add some DEBUG build support to catch and assert if someone does that. I didn't update the UPPERCASE verions of the iterators. They should probably be deprecated/removed. Signed-off-by: Rob Clark <robdclark@chromium.org> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
This commit is contained in:
parent
03ce12c5ed
commit
372e83b95f
1 changed files with 16 additions and 5 deletions
|
|
@ -43,6 +43,11 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "c99_compat.h"
|
#include "c99_compat.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define list_assert(cond, msg) assert(cond && msg)
|
||||||
|
#else
|
||||||
|
# define list_assert(cond, msg) (void)(0 && (cond))
|
||||||
|
#endif
|
||||||
|
|
||||||
struct list_head
|
struct list_head
|
||||||
{
|
{
|
||||||
|
|
@ -212,9 +217,12 @@ static inline void list_validate(const struct list_head *list)
|
||||||
pos = container_of(pos->member.prev, pos, member))
|
pos = container_of(pos->member.prev, pos, member))
|
||||||
|
|
||||||
#define list_for_each_entry(type, pos, head, member) \
|
#define list_for_each_entry(type, pos, head, member) \
|
||||||
for (type *pos = LIST_ENTRY(type, (head)->next, member); \
|
for (type *pos = LIST_ENTRY(type, (head)->next, member), \
|
||||||
|
*__next = LIST_ENTRY(type, pos->member.next, member); \
|
||||||
&pos->member != (head); \
|
&pos->member != (head); \
|
||||||
pos = LIST_ENTRY(type, pos->member.next, member))
|
pos = LIST_ENTRY(type, pos->member.next, member), \
|
||||||
|
list_assert(pos == __next, "use _safe iterator"), \
|
||||||
|
__next = LIST_ENTRY(type, __next->member.next, member))
|
||||||
|
|
||||||
#define list_for_each_entry_safe(type, pos, head, member) \
|
#define list_for_each_entry_safe(type, pos, head, member) \
|
||||||
for (type *pos = LIST_ENTRY(type, (head)->next, member), \
|
for (type *pos = LIST_ENTRY(type, (head)->next, member), \
|
||||||
|
|
@ -224,9 +232,12 @@ static inline void list_validate(const struct list_head *list)
|
||||||
__next = LIST_ENTRY(type, __next->member.next, member))
|
__next = LIST_ENTRY(type, __next->member.next, member))
|
||||||
|
|
||||||
#define list_for_each_entry_rev(type, pos, head, member) \
|
#define list_for_each_entry_rev(type, pos, head, member) \
|
||||||
for (type *pos = LIST_ENTRY(type, (head)->prev, member); \
|
for (type *pos = LIST_ENTRY(type, (head)->prev, member), \
|
||||||
|
*__prev = LIST_ENTRY(type, pos->member.prev, member); \
|
||||||
&pos->member != (head); \
|
&pos->member != (head); \
|
||||||
pos = LIST_ENTRY(type, pos->member.prev, member))
|
pos = LIST_ENTRY(type, pos->member.prev, member), \
|
||||||
|
list_assert(pos == __prev, "use _safe iterator"), \
|
||||||
|
__prev = LIST_ENTRY(type, __prev->member.prev, member))
|
||||||
|
|
||||||
#define list_for_each_entry_safe_rev(type, pos, head, member) \
|
#define list_for_each_entry_safe_rev(type, pos, head, member) \
|
||||||
for (type *pos = LIST_ENTRY(type, (head)->prev, member), \
|
for (type *pos = LIST_ENTRY(type, (head)->prev, member), \
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue