Nei commenti di linux/list.h
è scritto che:linux/list.h - Come rimuovere in sicurezza gli oggetti dalla lista?
- On utilizzando
list_del_entry
: Nota:list_empty
in entrata non restituisce vero dopo questo, la voce è in uno stato indefinito. - 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);
}
È 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). –