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:
BOOL ←
TRUE, traceAndSweep:
BOOL ←
FALSE];
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.