<> <> <> <> <> <> <> DIRECTORY Allocator USING[NHeaderP, SizeToBSIObj, BSIToSizeObj, BSIToFreeListObj], PrincOps USING[wordsPerPage]; ZCT: DEFINITIONS = BEGIN OPEN Allocator; <> zct: ZeroCountTable; ZeroCountTable: TYPE = LONG POINTER TO ZCTObject; zctBlockPages: NAT = 8; zctBlockWords: INT = zctBlockPages*wordsPerPage; wordsPerPage: NAT = PrincOps.wordsPerPage; logZCTBlockPages: NAT = 3; ZCTObject: TYPE = MACHINE DEPENDENT RECORD[ wp(0): LONG POINTER TO NHeaderP, rp(2): LONG POINTER TO NHeaderP, lastNP(4): LONG POINTER TO LONG POINTER, pad(6: 0..14): [0 .. LAST[CARDINAL]/2], markingDecrements(6: 15..15): BOOL, residueMask(7): CARDINAL, unused1(8): ARRAY [0..wordsPerPage-8) OF WORD, bsiToFreeList(wordsPerPage): BSIToFreeListObj, unused2(wordsPerPage+SIZE[BSIToFreeListObj]): ARRAY [0..wordsPerPage-SIZE[BSIToFreeListObj]) OF WORD, bsiToSize(2*wordsPerPage): BSIToSizeObj, unused3(2*wordsPerPage+SIZE[BSIToSizeObj]): ARRAY [0..wordsPerPage-SIZE[BSIToSizeObj]) OF WORD, sizeToBSI(3*wordsPerPage): SizeToBSIObj, unused4(3*wordsPerPage+SIZE[SizeToBSIObj]): ARRAY [0..2*wordsPerPage-SIZE[SizeToBSIObj]) OF WORD <> ]; <> <> <> <> <> <> <<>> FOSTableObject: TYPE = ARRAY FOSTableIndex OF FOSTableResidue; FOSTableIndex: TYPE = [0..FOSTableLength); FOSTableResidue: TYPE = CARDINAL; <> fosWildCard: FOSTableResidue = 177777B; fosEmpty: FOSTableResidue = 100000B; FOSTableLength: CARDINAL = 10000B; -- integral # pages <> StartMarkingDecrements: PROC; StopMarkingDecrements: PROC; ScanTheFrameHeap: PROC; MapReclaimableObjects: PROC[reclaim: PROC[NHeaderP]]; ResetStackBits: PROC; DoEnableFinalization: PROC[npr: NAT, nhp: NHeaderP]; DisableFinalization: PROC[npr: NAT, nhp: NHeaderP]; HandleRCUnderflow: PROC[ref: REF]; InnerHandleRCUnderflow: PROC[ref: REF]; HandleRCOverflow: PROC[ref: REF]; InnerHandleRCOverflow: PROC[ref: REF]; DecrForOverflow: PROC[rcDelta: NAT, nhp: NHeaderP] RETURNS[success: BOOL]; IncrForUnderflow: PROC[rcDelta: NAT, nhp: NHeaderP] RETURNS[success: BOOL]; TryToQItForFinalization: PROC[nhp: NHeaderP] RETURNS[success: BOOL]; Enter: PROC; EnterAndCallBack: PROC[proc: PROC]; EnterRCOvAndCallBack: PROC[proc: PROC]; RCOvReset: PROC; ExpandZCT: PROC; InitializeCleanup: PROC; <> <> <> <> <> <> <> <<>> <> <<(*) nhp.finalized = FALSE implies that nhp^ is of a finalizable type>> <> <<>> <] must be called by the client after the object has been initialized and REFS to it have been inserted in any "package" data structures.>> <<>> <> <<{nhp.finalized _ FALSE; nhp.refCount _ nhp.refCount - PackageCount[type]}>> <> <<>> <> END.