I\'m learning how to use the kernel linked-list API from list.h.
I learned that I need to use list_for_each_safe()
when deleting nodes off with list_d
pos = start;
del(pos);
pos = pos->next;
as opposed to
pos = start;
n = pos->next;
del(pos);
pos = n;
if del() is free() and memset(), pos->next is undefined
That is necessary because list_del
internally modifies the value of pos
fields. In your example the loop body even frees the memory occupied by pos
. Suppose that you would use unsafe version of the loop:
for (pos = (head)->next; pos != (head); pos = pos->next)
After executing the loop body pos
pointer becomes invalid breaking the increment expression: pos = pos->next
.
As opposite, the safe foreach pre-saves the value of pos->next
in a temporary variable and then refers to the latter instead of dereferencing pos
:
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)