Obsah / Utility / BUFFER / Uvolnění položky pole bufferů
Zdrojový kód: INCLUDE\UTIL\BUFFER.INC, UTIL\BUFFER.ASM
Uvolnění položky pole bufferů
Alokační položka může být uvolněna funkcí BuffFree. Jako vstupní parametr je funkci předán ukazatel na záhlaví pole bufferů v registru EDX a ukazatel na uvolňovanou položku v registru EAX. Ukazatel v EAX nesmí být nulový a musí se jednat o položku, která byla alokována pomocí funkce BuffAlloc. Po ukončení funkce je registr EAX vynulován pro zvýšení bezpečnosti, aby uvolněná položka nebyla znovu použita.
|
Na začátku funkce je uchován obsah registru EBX a obsah registru příznaků, zakázáno přerušení a uzamknut zámek bufferu BUFH_Lock. Tím je zabráněno souběhu operací mezi více procesory nebo souběhu s obsluhou přerušení.
|
Uvolňovaná položka je začleněna na začátek seznamu volných položek pomocí makra LISTADD. V registru EDX je ukazatel na záhlaví seznamu volných položek (je shodný s ukazatelem na pole bufferů), registr EAX obsahuje ukazatel na uvolňovanou položku a registr EBX je pracovní.
|
Z adresy položky (v registru EAX) je pomocí masky BUFH_BlockMask odvozena adresa začátku alokačního bloku a v jeho záhlaví je snížen počet použitých položek BUFB_Used. Pokud zůstávají v bloku i nadále použité alokační položky, funkce se ukončí.
Jsou-li již všechny alokační položky bloku uvolněny, může být uvolněn celý alokační blok. Z důvodu optimalizace nedojde k uvolnění bloku ihned, ale je ponechán jako rezervní blok (protože vyřazení alokačních položek z řetězce volných položek je časově náročná operace). Blok je zrušen jen když už nějaký rezervní blok existuje, jinak se funkce ukončí.
|
Před uvolněním alokačního bloku je potřeba uvolnit všechny alokační položky v bloku z řetězce volných alokačních položek. Nejdříve jsou uloženy obsahy registrů EAX, ECX, ESI a EDI. Do registru ECX se připraví počet položek, které bude potřeba uvolnit (z proměnné BUFH_Entries), registr EAX se posune na začátek první dealokované položky a do registru EDI se připravé velikost jedné položky (z proměnné BUFH_EntrySize). V cyklu se potom každá z položek odpojí ze seznamu volných položek pomocí makra LISTDEL. Registr EAX obsahuje ukazatel na dealokovanou položku a registry EBX a ESI jsou pracovní registry. Po uvolnění všech položek ze seznamu jsou obnoveny obsahy registrů EAX, ECX, ESI a EDI.
Nakonec je alokační blok dealokován pomocí funkce SysMemFree (registr EAX obsahuje adresu alokačního bloku).
|
V závěru funkce je zámek BUFH_Lock opět odemknut, navrácením registru příznaků je případně opět povoleno přerušení, je navrácen obsah registru EBX a registr EAX je vynulován.
Obsah / Utility / BUFFER / Uvolnění položky pole bufferů