w komentarzach linux/list.h
jest napisane, że:linux/list.h - Jak bezpiecznie usunąć elementy z listy?
- Na używając
list_del_entry
: Uwaga:list_empty
na wejściu nie zwraca prawda po tym, zapis jest w nieokreślonym stanie. - Dla
list_del
: Jest to tylko do wewnętrznej manipulacji listą, gdzie znamy już poprzednie/następne wpisy!
więc, w jaki sposób mogę bezpiecznie usunąć obiekt z połączonej listy i upewnij się, że jest funkcjonalny list_empty
lub upewnij się, że w przyszłym związane usunięcie węzła lista jest poprawna?
To moja realizacja obecnie:
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);
}
Musisz użyć blokady, jeśli lista może być używana z dwóch kontekstów. Notacja '_safe()' wydaje się być bezpieczna tylko dla przejścia listy (czytania) w kierunku do przodu. Niektóre 'archs' mogą być zapisane bez blokady, ale Linux jeszcze tego nie zrobił. (Mogło to być znane, ale myślę, że warto o tym wspomnieć). –