SafeStorage.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Paul Rovner, September 19, 1983 9:01 pm
Russ Atkinson (RRA) February 1, 1985 11:32:30 am PST
Beach, February 22, 1985 11:20:38 am PST
Doug Wyatt, February 24, 1985 8:32:21 pm PST
SafeStorage: CEDAR DEFINITIONS
= BEGIN
Zones
TrimSystemZone: PROC;
returns free VM pages to the operating system
GetSystemZone: PROC RETURNS[ZONE];
this is the default ZONE used by NEW
GetPermanentZone: PROC RETURNS[ZONE];
use this for NEW objects that will never be collected
Controlling the garbage collector
SetCollectionInterval: PROC[newInterval: INT] RETURNS[previous: INT];
establishes the number of words allocated between collections
ReclaimCollectibleObjects: PROC[suspendMe: BOOLTRUE, traceAndSweep: BOOLFALSE];
perform a garbage collection
Monitoring the garbage collector
ReclamationReason: TYPE = {clientRequest, clientTAndSRequest, clientNoTraceRequest, rcTableOverflow, allocationInterval, quantaNeeded, finalizationThreshold};
IsCollectorActive: PROC RETURNS[active: BOOL, previousIncarnation: INT];
WaitForCollectorStart: PROC RETURNS[incarnation: INT, reason: ReclamationReason,
wordsAllocated, objectsAllocated: INT -- since previous collection was initiated --];
WaitForCollectorDone: PROC RETURNS[incarnation: INT, reason: ReclamationReason,
wordsReclaimed: INT, objectsReclaimed: INT];
Statistics
NWordsAllocated: PROC RETURNS[INT];
returns total # words allocated since the last boot
NWordsReclaimed: PROC RETURNS[INT];
returns total # words reclaimed
Pinning objects in real memory
PinObject: PROC[ref: REF ANY];
pins the object (and its header) in real memory
UnpinObject: PROC[ref: REF ANY];
unpins the given object
Types
TypeIndex: TYPE = [0..LAST[CARDINAL]/4]; -- 14 bits
Type: TYPE = RECORD[TypeIndex];
nullType: Type = [0];
unspecType: Type = [1]; -- the distinguished type of UNSPECIFIED
fhType: Type = [2]; -- the distinguished type of localFrames
gfhType: Type = [3]; -- the distinguished type of globalFrames
anyType: Type = [4]; -- the distinguished type of ANY
lastPredefinedTypeIndex: TypeIndex = 4;
Predefined Types. All of these are treated specially by the implemention
There will be other predefined Types.
GetReferentType: PROC[ref: REF ANY] RETURNS[type: Type];
GetCanonicalReferentType: PROC[ref: REF ANY] RETURNS[type: Type];
... gets the canonical type for the given type
EquivalentTypes: PROC[t1, t2: Type] RETURNS[BOOL];
... tests the two types for equivalence (GetCanonicalType[t1] = GetCanonicalType[t2])
GetCanonicalType: PROC[type: Type] RETURNS[Type];
... gets the canonical type for the given type
IsReferentType: PROC[ref: REF ANY, type: Type] RETURNS[BOOL];
... tests the given ref for having the given referent type
NarrowRef: PROC[ref: REF ANY, type: Type] RETURNS[REF ANY];
Like NARROW, but uses a type code.
Raises NarrowRefFault if the given ref does not have that type.
Package finalization
BEWARE:
Establish finalization for a type BEFORE allocating any objects of the type.
Allocate objects of the type ONLY in the same program module in which the calls to establish finalization appear. Use exactly the same type expression in these calls and in NEW expressions for objects of the type.
Invoke EnableFinalization after each new finalizable object has been inserted in its package data structure (i.e. after its "package refs" have been created).
maxNPackageRefs: CARDINAL = 2;
FinalizationQueue: TYPE = PRIVATE RECORD[REF ANY];
EstablishFinalization: PROC[type: Type, npr: [0..maxNPackageRefs],
fq: FinalizationQueue];
EstablishFinalization will raise CantEstablishFinalization if type was previously finalizable.
ReEstablishFinalization: PROC[type: Type, npr: [0..maxNPackageRefs],
fq: FinalizationQueue];
Use this to specify a new FinalizationQueue for a previously established finalizable type. This is useful during the edit-compile-test loop for running new versions of a program that establishes finalization for a Type.
ReEstablishFinalization will raise CantEstablishFinalization if type was not previously finalizable or if the new number of package refs is different than before.
EnableFinalization: PROC[ref: REF ANY];
Use this for a new finalizable object after establishing its package refs.
IsFinalizationEnabled: PROC[ref: REF ANY] RETURNS[BOOL];
Use this in conjunction with a finalizable cache.
NewFQ: PROC[length: CARDINAL ← 100] RETURNS [FinalizationQueue];
Returns a new FinalizationQueue with the given capacity for holding REFs to be finalized.
FQNext: PROC[fq: FinalizationQueue] RETURNS[REF ANY];
... waits for the given FinalizationQueue to be non-empty
FQEmpty: PROC[fq: FinalizationQueue] RETURNS[BOOL];
... tests the given FinalizationQueue for being empty
Type attachments
PutTypeAttachment: PROC[type: Type, attachment: REF ANY];
... associates a given REF with a given type
GetTypeAttachment: PROC[type: Type] RETURNS[REF ANY];
... gets the REF associated with the given type
Signals and Errors
MemoryExhausted: ERROR;
NarrowFault: ERROR;
NarrowRefFault: ERROR[ref: REF ANY, targetType: Type];
UnsafeProcAssignment: SIGNAL[proc: PROC ANY RETURNS ANY];
InvalidType: ERROR[type: Type];
CantEstablishFinalization: ERROR[type: Type];
END.