SafeStorage.Mesa
last edited September 19, 1983 9:01 pm by Paul Rovner
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--words--] 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: INT, --since previous collection was initiated
objectsAllocated: INT];
WaitForCollectorDone: PROC
RETURNS[
incarnation: INT,
reason: ReclamationReason,
wordsReclaimed: INT,
objectsReclaimed: INT];
Statistics
NWordsAllocated: PROC RETURNS[INT]; -- returns total # words allocated
NWordsReclaimed: PROC RETURNS[INT]; -- returns total # words reclaimed
Pinning objects in real memory (not implemented until the newsafestorage stuff is in)
PinObject: PROC[ref: REF ANY]; -- pins the object and its header in real memory
UnpinObject: PROC[ref: REF ANY];
TYPEs
TypeIndex: TYPE = [0..LAST[CARDINAL]/4]; -- 14 bits
Type: TYPE = RECORD[TypeIndex];
predefined Types. All of these are treated specially by the implemention
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;
There will be other predefined Types.
GetReferentType: PROC[ref: REF ANY] RETURNS[type: Type];
GetCanonicalReferentType: PROC[ref: REF ANY] RETURNS[type: Type];
EquivalentTypes: PROC[t1, t2: Type] RETURNS[BOOL];
GetCanonicalType: PROC[type: Type] RETURNS[Type];
IsReferentType: PROC[ref: REF ANY, type: Type] RETURNS[BOOL];
NarrowRef: PROC[ref: REF ANY, type: Type] RETURNS[REF ANY];
Raises NarrowRefFault
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 the exact same type expression in these calls and in NEW expressions for objects of the type.
Invoke ClearFinalizedFlag 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. This will be implemented when the NewSafeStorage stuff is in place.
NewFQ: PROC[length: CARDINAL ← 10--refs--] RETURNS[FinalizationQueue];
FQNext: PROC[fq: FinalizationQueue] RETURNS[REF ANY]; -- waits 'till there is one
FQEmpty: PROC[fq: FinalizationQueue] RETURNS[BOOL];
Type attachments
PutTypeAttachment: PROC[type: Type, attachment: REF ANY];
GetTypeAttachment: PROC[type: Type] RETURNS[REF ANY];
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.