Re[3]: [pso] list_head si kfree()
Diaconescu
pso@cursuri.cs.pub.ro
Sun, 28 Mar 2004 03:00:14 +0300
Hello Andrei,
Sunday, March 28, 2004, 2:20:53 AM, you wrote:
D>> Sau raspunsul scurt: foloseste functiile (adica define-urile) list_for_each_safe() sau
D>> list_for_each_entry_safe().
AC> Pentru un raspuns scurt, si o intrebare scurta :)) - de ce totusi
AC> exista macros cu _safe si fara _safe - give me an unbeatable reason :)!
Toate macrourile cu ..._for_each_... sunt de fapt niste instructiuni
'for'.
Macrourile fara 'safe' sunt ceva mai rapide. Pasul de incrementare din
'for' este ceva gen nod_curent=nod_curent->next
Macrourile cu 'safe' sunt putin mai lente fiindca fac o copie a nodului curent,
si la pasul de incrementare fac: nod_curent=copie_nod_curent->next.
Care e diferenta?
Pai daca tu in pasul curent scoti (cu list_del() ) nodul curent, atunci
elementele next si prev ale nodului curent sunt puse pe ZERO.
[vezi
http://atlantis.cs.pub.ro/lxr/http/source/include/linux/list.h#L91 ]
Si cand se ajunge la incrementarea din 'for', se intampla asa ( ):
(fara ..._safe): nod_curent=nod_curent->next <==> nod_curent = ZERO
(cu ..._safe): nod_curent=copie_nod_curent->next <==> nod_curent = ce_trebuie
Evident, la urmatoarea iteratie, in cazul fara _safe, saracul 'for' va
incerca sa faca referire la adresa ZERO... parca si aud zgomotul de
dinti scrasnitzi scos de kernel... (si da, ar cam fi cazul sa ma culc :-)
--
Best regards,
Diaconescu mailto:diaconescu@gmx.net
--
" Computers don't make errors...
What they do, they do on purpose! "