-- RTStorageAccounting.Mesa
-- last edited January 14, 1983 9:06 am by Paul Rovner

DIRECTORY
PSB USING[PsbIndex],
RTRefCounts USING[InternalReclaim],
RTOS USING[GetCurrent];

RTStorageAccounting: DEFINITIONS
IMPORTS RTOS, RTRefCounts
= BEGIN

-- TYPES
PSBIMap: TYPE = RECORD[elements: SEQUENCE maxLength: CARDINAL OF CellCount];
CellCount: TYPE = RECORD[total, current: LONG INTEGER];

-- CONSTANTS
defaultCollectionInterval: LONG CARDINAL = 40000B;

-- VARIABLES
nWordsRequested: LONG CARDINAL;
nWordsAllocated: LONG CARDINAL;
SUMnWordsAllocated: LONG CARDINAL;
nObjectsCreated: LONG CARDINAL;
MapPsbiToWordsAllocated: LONG POINTER TO PSBIMap;

CollectionInterval: LONG INTEGER;
SuspensionThreshold: LONG INTEGER;

AllocatorCallbackProcForSpy: UNSPECIFIED; -- YAAAAAAAAAAHHHHRRRRRGGGGGHHHH

--PROCS

ResetNWordsAllocated: PROC;

ResetTotalNWordsAllocatedOnly: PROC;

ConsiderCollection: PROC[requestedWords, suppliedWords: LONG CARDINAL] =
INLINE
{psbi: PSB.PsbIndex = RTOS.GetCurrent[];
nw: LONG INTEGER ← MapPsbiToWordsAllocated.elements[psbi].current + suppliedWords;
MapPsbiToWordsAllocated.elements[psbi].current ← nw;

nWordsAllocated ← nWordsAllocated + suppliedWords;
-- total count for all processes since the last colection

nWordsRequested ← nWordsRequested + requestedWords; -- total count for all processes

IF LOOPHOLE[nWordsAllocated, INT] >= CollectionInterval
THEN RTRefCounts.InternalReclaim[allocationInterval,
nw > SuspensionThreshold]};

END.