-- file Alloc.mesa -- last modified by Bruce, 20-Aug-81 11:14:25 -- last modified by Sweet, 19-Aug-81 12:14:14 -- last modified by Satterthwaite, 2-Oct-81 11:22:26 Alloc: DEFINITIONS = { Selector: TYPE = CARDINAL; Base: TYPE = LONG ORDERED BASE POINTER; Limit: CARDINAL = LAST[CARDINAL]; Index: TYPE = Base RELATIVE POINTER [0..Limit); OrderedIndex: TYPE = Base RELATIVE ORDERED POINTER [0..Limit); Handle: TYPE = LONG POINTER TO InstanceData; InstanceData: TYPE; -- allocation from the tables as stacks Words: PROC [h: Handle, table: Selector, size: CARDINAL] RETURNS [OrderedIndex]; Trim: PROC [h: Handle, table: Selector, size: CARDINAL]; -- allocation from free list defaultChunkType: Selector = FIRST[Selector]; GetChunk: PROC [h: Handle, size: CARDINAL, table: Selector ← defaultChunkType] RETURNS [Index]; FreeChunk: PROC [h: Handle, index: Index, size: CARDINAL, table: Selector ← defaultChunkType]; -- inquiries Bounds: PROC [h: Handle, table: Selector] RETURNS [base: Base, size: CARDINAL]; Top: PROC [h: Handle, table: Selector] RETURNS [OrderedIndex] = INLINE { RETURN[FIRST[OrderedIndex] + h.Bounds[table].size]}; -- inquiries and notification of moving subtables Notifier: TYPE = PROC [base: LONG DESCRIPTOR FOR ARRAY Selector OF Base]; AddNotify: PROC [h: Handle, proc: Notifier]; DropNotify: PROC [h: Handle, proc: Notifier]; -- initialization and termination maxForBits: ARRAY [1..16] OF CARDINAL = [ 1b, 3b, 7b, 17b, 37b, 77b, 177b, 377b, 777b, 1777b, 3777b, 7777b, 17777b, 37777b, 77777b, 177777b]; pagesForBits: ARRAY [1..16] OF CARDINAL = [ 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 64, 128, 256]; defaultIndexBits: CARDINAL = 14; defaultTileSize: CARDINAL = 8; TableInfo: TYPE = RECORD [ initialPages: [0..377b], variant: SELECT useFullVmem: BOOLEAN FROM FALSE => [initialVMemPages: [0..177b]], TRUE => [], ENDCASE ← TRUE[]]; Create: PROC [ weights: DESCRIPTOR FOR ARRAY OF TableInfo, indexBits: CARDINAL ← defaultIndexBits, tileSize: CARDINAL ← defaultTileSize] RETURNS [Handle]; Destroy: PROC [Handle]; Reset: PROC [Handle]; Chunkify: PROC [ h: Handle, table: Selector ← defaultChunkType, firstSmall: CARDINAL ← 3, nSmall: CARDINAL ← 4]; UnChunkify: PROC [h: Handle, table: Selector]; ResetChunk: PROC [h: Handle, table: Selector]; ResetTable: PROC [h: Handle, table: Selector, info: TableInfo]; Failure: ERROR [h: Handle, table: Selector]; Overflow: SIGNAL [h: Handle, table: Selector] RETURNS [extra: CARDINAL]; }.