-- SafeStorage.Mesa -- last edited May 27, 1982 12:51 pm by Paul Rovner DIRECTORY RTBasic USING[Base, nullBase, Type]; SafeStorage: CEDAR DEFINITIONS = BEGIN OPEN RTBasic; -- For managing ZONEs SizeRepresentation: TYPE = {quantized, prefixed}; NewZone: PROC [ sr: SizeRepresentation ← prefixed, base: Base ← nullBase, -- default will use the RootBase initialSize: LONG CARDINAL ← 0 -- words ] RETURNS[ZONE]; TrimZone: PROC[zone: ZONE]; -- return unused quanta to zone's Base TrimAllZones: PROC; -- applies TrimZone to each ZONE MergeAllPrefixedZones: PROC; -- for each prefixed ZONE, merge adjacent free blocks by scanning its free list IsZoneEmpty: PROC[zone: ZONE] RETURNS[BOOLEAN]; -- TRUE if no quanta are assigned to zone GetSystemZone: PROC RETURNS[ZONE]; -- a built-in, prefixed ZONE in baseRoot -- For controlling the garbage collector -- establishes the number of cells allocated between collections SetCollectionInterval: PROC[newInterval: LONG CARDINAL--words--] RETURNS[previous: LONG CARDINAL]; -- establishes a maximum amount of VM that can be assigned to -- the Cedar allocators: when this threshold is crossed, -- a collection that trims all zones and the root Base will -- occur. 0 => no limit enforced by the Cedar allocators. SetMaxDataQuanta: PROC[nQuanta: CARDINAL--4 pages per quantum--] RETURNS[previous: CARDINAL]; -- perform a garbage collection ReclaimCollectibleObjects: PROC[suspendMe: BOOLEAN ← TRUE, traceAndSweep: BOOLEAN ← FALSE]; -- For monitoring the garbage collector ReclamationReason: TYPE = {clientRequest, clientTAndSRequest, clientNoTraceRequest, rcTableOverflow, allocationInterval, quantaNeeded, finalizationThreshold}; IsCollectorActive: PROC RETURNS[active: BOOLEAN, previousIncarnation: CARDINAL]; WaitForCollectorStart: PROC RETURNS[incarnation: CARDINAL, reason: ReclamationReason, wordsAllocated: LONG CARDINAL, -- since previous collection was initiated objectsAllocated: LONG CARDINAL]; WaitForCollectorDone: PROC RETURNS[incarnation: CARDINAL, reason: ReclamationReason, wordsReclaimed: LONG CARDINAL, objectsReclaimed: LONG CARDINAL]; -- Statistics NWordsAllocated: PROC RETURNS[LONG CARDINAL]; -- returns total # words allocated so far NWordsReclaimed: PROC RETURNS[LONG CARDINAL]; -- returns total # words reclaimed so far -- Bases NewBase: PROC[nWords: LONG CARDINAL, baseParent: Base ← nullBase] RETURNS[Base]; GetRootBase: PROC RETURNS[Base]; TrimRootBase: PROC RETURNS[nSpacesDeleted: CARDINAL]; -- Unusual operations on ZONEs for sophisticated clients ZoneFullProc: TYPE = PROC[zone: ZONE, size: LONG CARDINAL--words--]; ExtendZone: ZoneFullProc; SetZoneFullProc: PROC -- the default "FullProc" is ExtendZone [ zone: ZONE, proc: ZoneFullProc ] RETURNS[previous: ZoneFullProc]; -- SIGNALs and ERRORs InvalidSize: ERROR[size: LONG CARDINAL]; -- Raised by NewBase, NewZone, ExtendZone MemoryExhausted: ERROR[base: Base]; NarrowFault: ERROR; NarrowRefFault: ERROR[ref: REF ANY, targetType: Type]; UnsafeProcAssignment: SIGNAL[proc: PROC ANY RETURNS ANY]; END.