2013-03-11 9 views
7

w komentarzach linux/list.h jest napisane, że:linux/list.h - Jak bezpiecznie usunąć elementy z listy?

  1. Na używając list_del_entry: Uwaga: list_empty na wejściu nie zwraca prawda po tym, zapis jest w nieokreślonym stanie.
  2. 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); 
} 
+0

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ć). –

Odpowiedz

5

Chyba nie zrozumiałeś komentarze. Pierwsza z nich mówi, że list_empty(&entry->list) nie zwróci wartości true. Jeśli jednak usuniesz wszystkie elementy z listy (sposób, w jaki to zrobisz, jest poprawny) i zrobisz list_empty(&mylist.list), otrzymasz wynik.

Jeśli z jakiegoś powodu chcesz zachować pozycję struct list_head w stanie zgodnym wewnętrznie, użyj list_del_init.

Po drugie, __list_del służy wyłącznie do użytku wewnętrznego, list_del jest grą fair.

+0

+1, Chciałbym również zauważyć, że 'list_del()' nie jest do użytku wewnętrznego, '__list_del()' jest. – Hasturkun

+0

Masz rację @Hasturkun, dzięki za ten komentarz. –

+0

+1 Zobacz także http://lwn.net/Articles/336255/, który zawiera przegląd wzorców użytkowania. –

Powiązane problemy