DIRECTORY Allocator USING[NHeaderP, BlockSizeIndex, FNHeaderP], CedarMicrocode USING[CREATEREF, RECLAIMEDREF, ALLOCATE, FREEPLEASE], Collector USING[Disposition], SafeStorage USING[Type], ZCT USING[FOSTableIndex, FOSTableResidue, ZeroCountTable]; RCMicrocodeOps: DEFINITIONS IMPORTS CedarMicrocode = BEGIN OPEN Allocator, ZCT; RCOverflowOccurred: ERROR; RCUnderflowOccurred: ERROR; LookFurtherAtReclaimedRef: ERROR; ZCTFull: ERROR; NormalFreeListEmpty: ERROR; FOSTableHash: PROC[nhp: NHeaderP--maybe bogus--] RETURNS[x: FOSTableIndex, r: FOSTableResidue]; ASSIGNREF: PROC[rhs: REF, lhs: LONG POINTER TO REF]; OnZ: PROC [nhp: NHeaderP]; rcMicrocodeExists: BOOL; rcMicrocodeWasEnabled: BOOL; ALLOCATE: PROC[--requested--size: CARDINAL, type: SafeStorage.Type] RETURNS[REF]; Allocate: PROC[size: CARDINAL, type: SafeStorage.Type] RETURNS[r: REF] = INLINE{ r _ IF rcMicrocodeExists THEN CedarMicrocode.ALLOCATE[size, type] ELSE SoftwareAllocate[size, type]; }; SoftwareAllocate: PROC[--requested--size: CARDINAL, type: SafeStorage.Type] RETURNS[REF]; FREEPLEASE: PROC[nhp: NHeaderP] RETURNS[success: BOOL]; Free: PROC[nhp: NHeaderP] RETURNS[success: BOOL] = INLINE{ success _ IF rcMicrocodeExists THEN CedarMicrocode.FREEPLEASE[nhp] ELSE SoftwareFree[nhp]; }; SoftwareFree: PROC[nhp: NHeaderP] RETURNS[success: BOOL]; InsertQuanta: PROC[bsi: BlockSizeIndex, first, last: FNHeaderP]; DoFREE: PROC[fnhp: FNHeaderP, bsi: BlockSizeIndex]; CREATEREF: PROC[nhp: NHeaderP]; CreateRef: PROC[nhp: NHeaderP] = INLINE{ IF rcMicrocodeExists THEN CedarMicrocode.CREATEREF[nhp] ELSE SoftwareCreateRef[nhp]; }; SoftwareCreateRef: PROC[nhp: NHeaderP]; RECLAIMABLEREF: PROC[nhp: NHeaderP] RETURNS[Collector.Disposition]; RECLAIMEDREF: PROC[ref: REF] RETURNS[REF]; ReclaimedRef: PROC[ref: REF] RETURNS[REF ANY] = INLINE{ IF rcMicrocodeExists THEN RETURN[CedarMicrocode.RECLAIMEDREF[ref]] ELSE RETURN[SoftwareReclaimedRef[ref]]; }; SoftwareReclaimedRef: PROC[ref: REF] RETURNS[REF ANY]; DISABLEMICROCODE: PROC[z: ZeroCountTable]; ENABLEMICROCODE: PROC[z: ZeroCountTable] RETURNS[ucVersion: NAT]; END. zRCMicrocodeOps.mesa Definitions for control of the Cedar incremental collector Paul Rovner, December 6, 1983 2:33 pm rcBottom: RefCount = 32; ReclaimedRef is called by the reclaimer on each ref that it finds within an object being reclaimed. ReclaimedRef will decrement the reference count on ref^ and return a non-NIL result if the referenced object can be reclaimed. Κ­˜Jšœ™Jšœ:™:Jšœ%™%J˜šΟk ˜ Jšœ œ&˜5Jšœœ œ"œ˜DJšœ œ˜Jšœ œ˜Jšœœ1˜:J˜—š œ œœœœ œ˜OJ˜Jšœ™J˜Jšœœ˜Jšœœ˜Jšœœ˜!Jšœ œ˜Jšœœ˜J˜procšΟn œœΟcœ˜0Kšœ'˜.—JšΠbk œœœœœœœ˜4Jšžœœ˜J˜Jšœœ˜Jšœœ˜J˜Jš  œœŸ œœœœ˜QJš žœœœœœ˜Hšœ˜šœœ˜Jšœœ ˜)Jšœ˜#—Jšœ˜šžœœŸ œœ˜KJšœœ˜ ——J˜Jš  œœœ œ˜7Jšžœœœ œ˜2šœ˜šœ œ˜Jšœ œ˜$Jšœ˜—Jšœ˜Jšž œœœ œ˜9—J˜Jšž œœ.˜@Jšžœœ'˜3J˜Jš  œœ˜šž œœ˜ Jšœ˜šœ˜Jšœ œ˜"Jšœ˜—Jšœ˜Jšžœœ˜'J˜—Jš œœœ˜CJš   œœœœœ˜*™Jšœγ™γ—š ž œœœœœœ˜/Jšœ˜šœ˜Jšœœ œ˜-Jšœœ˜'—Jšœ˜Jš žœœœœœœ˜6——˜Jš œœ˜*Jš œœœ œ˜AJ˜—Jšœ˜J˜J˜—…—2 Y