Estoy aprendiendo a usar la API de lista de enlaces del kernel desde list.h.¿Por qué necesitamos list_for_each_safe() para eliminar nodos en la lista de kernel linked?
Me enteré de que necesito usar list_for_each_safe()
al eliminar nodos con list_del()
en lugar de usar list_for_each()
.
Código de 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)
Código de list_for_each()
:
for (pos = (head)->next; pos != (head); pos = pos->next)
Me he dado cuenta que ambos son muy similares excepto que la versión _safe
toma un argumento adicional para ser utilizado como 'almacenamiento temporal' (indicado aquí, list.h).
Entiendo cuándo aplicar la función correctamente, _safe
versión para eliminar, versión normal para acceder, pero me llama la atención cómo el argumento adicional lo hizo 'seguro'?
considere lo siguiente, donde estoy borrando cada nodo en una lista enlazada utilizando 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);
}
¿Cómo dar q
ayuda en la eliminación de?
¡Gracias por cualquier ayuda!
lo tengo, nunca pensó que esto es lo sencillo, Gracias ! –
q debería haber sido nombrado de una mejor manera ... algo así como pos_next. –