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! "