Obsah / Utility / BUFFER / Alokace nové položky z pole bufferů
Zdrojový kód: INCLUDE\UTIL\BUFFER.INC, UTIL\BUFFER.ASM
Alokace nové položky z pole bufferů
K alokaci nové položky z pole bufferů slouží funkce BuffAlloc. Jako vstupní parametr je funkci předán ukazatel na záhlaví pole bufferů v registru EDX. Je-li nová položka úspěšně alokována, je její adresa navrácena v registru EAX a příznak CF je vynulován (tj. je podmínka NC). Pokud se položku nepodařilo alokovat (z důvodu nedostatku systémové paměti), je obsah registru EAX vynulován a příznak CF je nastavený (tj. je podmínka CY).
|
Na začátku funkce je uchován obsah registru EBX a obsah registru příznaků, je 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í.
|
Je proveden test seznamu volných alokačních položek. Je-li k dispozici nějaká volná alokační položka, přejde se k obsluze vyjmutí položky ze seznamu volných položek.
|
Není-li k dispozici žádná volná alokační položka, je nutné alokovat od systému nový alokační block. Z proměnné BUFH_BlockSize se do registru EAX načte velikost alokačního bloku a vyžádá se od systému přidělení takového bloku (SysMemAlloc). Při neúspěchu funkce předčasně skončí s příznakem chyby paměti (registr EAX v tom případě obsahuje 0).
Po úspěšné alokaci paměti se bude pokračovat začleněním nových alokačních položek do řetězce volných položek. Uchovají se registry ECX a ESI a vynuluje se čítač použitých položek BUFB_Used. Do registru ECX se připraví počet položek, které bude potřeba inicializovat (z proměnné BUFH_Entries), registr EAX se posune na začátek první alokované položky a do registru ESI se připraví velikost jedné položky (z proměnné BUFH_EntrySize). V cyklu se potom každá z položek připojí na konec seznamu volných položek pomocí makra LISTLAST. Registr EDX obsahuje záhlaví seznamu volných položek (protože záhlaví seznamu je umístěno na začátku popisovače pole bufferů), registr EAX obsahuje nově přidávanou položku a registr EBX je pracovní registr. Po přidání všech položek do seznamu jsou obnoveny obsahy registrů ECX a ESI.
|
Je-li k dispozici nějaká volná alokační položka, je ze seznamu volných položek uvolněna první položka pomocí makra LISTDELPREV. Registr EAX obsahuje ukazatel na první položku seznamu (která bude uvolněna), registr EDX obsahuje ukazatel na záhlaví seznamu volných položek (je shodný s ukazatelem na pole bufferů) a registr EBX je přechodný registr.
Po uvolnění alokační položky ze seznamu volných položek je pomocí masky BUFH_BlockMask odvozena z adresy položky (v registru EAX) adresa začátku alokačního bloku a inkrementován počet použitých položek BUFB_Used.
Jedná-li se o alokační blok, který byl uchován jako rezervní blok, je položka BUFH_Reserve vynulována, protože tento blok již nesmí být zrušen.
|
Při ukončení 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. Protože se během navrácení registru příznaků neuchová nastavení příznaku CF, použijí se 2 varianty ukončení funkce - jedna s vynulovaným příznakem chyby a jedna s nastaveným příznakem.
Obsah / Utility / BUFFER / Alokace nové položky z pole bufferů