SafeStorage.mesa
Copyright Ó 1985, 1986, 1991, 1992 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, November 14, 1986 4:20:51 pm PST
Carl Hauser, March 30, 1988 3:21:37 pm PST
Willie-s, March 3, 1992 12:19 pm PST
Michael Plass, November 22, 1991 10:48 am PST
 
SafeStorage: CEDAR DEFINITIONS
= BEGIN
Zones
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
 
GetUntracedZone: 
UNSAFE 
PROC 
RETURNS [
ZONE];
use this for NEW objects that are known to contain no REFs
 
 
Access to the underlying allocator
NewObject: 
PRIVATE 
PROC [nUnits: 
INT, type: SafeStorage.Type] 
RETURNS [
REF] ~ 
TRUSTED 
MACHINE 
CODE {
"XR←NewObject"
};
 
NewUntracedObject: 
PROC [nUnits: 
INT, type: Type] 
RETURNS [
REF] ~ 
TRUSTED 
MACHINE 
CODE {
"XR←NewUntracedObject"
};
 
GetTypeIndex: 
PRIVATE 
PROC [typeString: 
STRING, struct, rcmap: 
POINTER] 
RETURNS [Type] ~ 
TRUSTED 
MACHINE 
CODE {
"XR←GetTypeIndex"
};
 
 
Controlling the garbage collector
SetCollectionInterval: 
PROC [newInterval: 
CARD] 
RETURNS [previous: 
CARD];
establishes the number of bytes 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
CurrentByteCount: 
PROC 
RETURNS [
CARD];
The current number of bytes allocated.  This number increases continuously (at each allocation) but shrinks only after collections.
 
CurrentObjectCount: 
PROC 
RETURNS [
CARD];
The current number of objects allocated.  This number increases continuously (at each allocation) but shrinks only after collections.
 
TotalByteCount: 
PROC 
RETURNS [
CARD];
The total number of bytes allocated since startup.  This number increases continuously.
 
TotalObjectCount: 
PROC 
RETURNS [
CARD];
The total number of objects allocated since startup.  This number increases continuously.
 
HeapSize: 
PROC 
RETURNS [
CARD];
The size of the heap in bytes.
 
 
Types
TypeIndex: 
TYPE = 
CARDINAL;  
Type: TYPE = MACHINE DEPENDENT {null(0), last(TypeIndex.LAST)};
nullType: Type = VAL[0];
unspecType: Type = VAL[1];  -- the distinguished type of UNSPECIFIED
fhType: Type = VAL[2];  -- the distinguished type of localFrames
gfhType: Type = VAL[3]; -- the distinguished type of globalFrames
anyType: Type = VAL[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.
 
 
Signals and Errors
NarrowRefFault: 
ERROR [ref: 
REF 
ANY, targetType: Type];
 
UnsafeProcAssignment: 
SIGNAL [proc: 
PROC 
ANY 
RETURNS 
ANY];
 
InvalidType: ERROR [type: Type];
 
END.
Willie Sue Orr, July 25, 1991 3:36:17 pm PDT: folded in SafeStorageExtras
Michal Plass, November 22, 1991: removed finalization procs; use Finalization instead.  Also added UnsafeProcAssignment check, rationalized statistics, removed other unimplemented procedures.
Willie Sue Orr, March 3, 1992 12:18:52 pm PST: changed TypeIndex to be CARDINAL instead of CARD16.