Зачем нам нужен list_for_each_safe () для удаления узлов в связанном списке ядра?

Я учусь использовать API связанного списка ядра изlist.h.

Я узнал, что мне нужно использоватьlist_for_each_safe() при удалении узлов сlist_del() Вместо того, чтобы использоватьlist_for_each().

Код дляlist_for_each_safe():

#define list_for_each_safe(pos, n, head) \
    for (pos = (head)->next, n = pos->next; pos != (head); \
        pos = n, n = pos->next)

Код дляlist_for_each():

    for (pos = (head)->next; pos != (head); pos = pos->next)

Я заметил, что они оба очень похожи, за исключением того, что_safe версия принимает дополнительный аргумент для использования в качестве «временного хранилища» (здесь указано,list.h).

Я понимаю, когда применять функцию правильно,_safe версия для удаления, обычная версия для доступа, но мне интересно, как дополнительный аргумент сделал ее «безопасной»?

Рассмотрим следующее, где я удаляю каждый узел в связанном списке, используяlist_for_each_safe():

struct kool_list{
    int to;
    struct list_head list;
    int from;
    };

struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist;

list_for_each_safe(pos, q, &mylist.list){
         tmp= list_entry(pos, struct kool_list, list);
         printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
         list_del(pos);
         free(tmp);
    }

Как даетq помощь в удалении?

Спасибо за любую помощь!

Ответы на вопрос(2)

Ваш ответ на вопрос