2013-03-11 15 views
7

Nei commenti di linux/list.h è scritto che:linux/list.h - Come rimuovere in sicurezza gli oggetti dalla lista?

  1. On utilizzando list_del_entry: Nota: list_empty in entrata non restituisce vero dopo questo, la voce è in uno stato indefinito.
  2. Per list_del: Questo è solo per la manipolazione di elenchi interni in cui conosciamo già le voci precedenti/precedenti!

Così, come potrei tranquillamente rimuovere un oggetto dalla lista collegata e fare in modo che list_empty è funzionale o fare in modo che il prossimo collegato la cancellazione nodo lista è corretta?

Questa è la mia implementazione attualmente:

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

È necessario utilizzare un blocco se l'elenco può essere utilizzato da due contesti. La notazione '_safe()' sembra essere sicura solo per l'attraversamento della lista (lettura) nella direzione in avanti. Alcuni 'archs' possono essere scritti senza lock, ma Linux deve ancora farlo. (Questo potrebbe essere stato conosciuto, ma penso che sia degno di nota). –

risposta

5

Penso che frainteso i commenti. Il primo dice che list_empty(&entry->list) non restituirà true. Tuttavia, se si rimuovono tutti gli elementi dall'elenco (il modo in cui lo si fa è corretto) e lo si fa list_empty(&mylist.list) si otterrà il risultato.

Se per qualche motivo si desidera mantenere lo stato struct list_head della voce in uno stato internamente coerente, utilizzare list_del_init.

In secondo luogo, __list_del è solo per uso interno, list_del è un gioco equo.

+0

+1, vorrei anche notare che 'list_del()' non è per uso interno, '__list_del()' è. – Hasturkun

+0

Hai ragione @Hasturkun, grazie per questo commento. –

+0

+1 Vedi anche http://lwn.net/Articles/336255/ che fornisce una panoramica dei modelli di utilizzo. –

Problemi correlati