DIRECTORY Finalization ; FinalizationImpl: CEDAR PROGRAM EXPORTS Finalization ~ { FinalizationState: TYPE ~ Finalization.FinalizationState; Handle: TYPE ~ REF FinalizableObject; FinalizableObject: PUBLIC TYPE ~ WORD32 MACHINE DEPENDENT RECORD [ word1(0): CARD32, word2(1): CARD32, finalizationQueue(2): FinalizationQueue, next(3): Handle ]; FinalizationQueue: TYPE ~ REF FinalizationQueueRep; FinalizationQueueRep: PUBLIC TYPE ~ WORD32 MACHINE DEPENDENT RECORD [ head(0): Handle, tail(1): Handle, nonempty(2): CONDITION ]; NewFQ: PUBLIC PROC RETURNS [FinalizationQueue] ~ { XRNewFQ: PROC RETURNS [FinalizationQueue] ~ TRUSTED MACHINE CODE { "XR_NewFQ" }; RETURN[ XRNewFQ[] ]; }; FQEmpty: PUBLIC PROC [fq: FinalizationQueue] RETURNS[BOOL] ~ { XRFQEmpty: PROC [fq: FinalizationQueue] RETURNS[BOOL] ~ TRUSTED MACHINE CODE { "XR_FQEmpty" }; RETURN [ XRFQEmpty[fq] ]; }; FQNextNoAbort: PUBLIC PROC [fq: FinalizationQueue] RETURNS[handle: Handle] ~ { XRFQNextNoAbort: PROC [fq: FinalizationQueue] RETURNS[handle: Handle] ~ TRUSTED MACHINE CODE { "XR_FQNextNoAbort" }; RETURN [ XRFQNextNoAbort[fq] ]; }; FQNext: PUBLIC PROC [fq: FinalizationQueue] RETURNS[handle: Handle ¬ NIL] ~ { XRFQNextNoAbort: PROC [fq: FinalizationQueue] RETURNS[handle: Handle] ~ TRUSTED MACHINE CODE { "XR_FQNextNoAbort" }; handle ¬ FQNextNoAbort[fq]; IF handle = NIL THEN ERROR ABORTED; }; EnableFinalization: PUBLIC PROC [object: REF, fq: FinalizationQueue] RETURNS [handle: Handle] ~ { XREnableFinalization: PROC [object: REF, fq: FinalizationQueue, handle: Handle] ~ TRUSTED MACHINE CODE { "XR_EnableFinalization" }; handle ¬ NEW[ FinalizableObject ¬ [0, 0, fq, NIL]]; XREnableFinalization[object, fq, handle]; }; DisableFinalization: PUBLIC PROC [handle: Handle] RETURNS [oldState: FinalizationState] ~ { XRDisableFinalization: PROC [handle: Handle] RETURNS [oldState: FinalizationState] ~ TRUSTED MACHINE CODE { "XR_DisableFinalization" }; RETURN[ XRDisableFinalization[handle] ]; }; ReenableFinalization: PUBLIC PROC [handle: Handle, fq: FinalizationQueue] RETURNS [oldState: FinalizationState] ~ { XRReenableFinalization: PROC [handle: Handle, fq: FinalizationQueue] RETURNS [oldState: FinalizationState] ~ TRUSTED MACHINE CODE { "XR_ReenableFinalization" }; RETURN[ XRReenableFinalization[handle, fq] ]; }; GetFinalizationState: PUBLIC PROC [handle: Handle] RETURNS [state: FinalizationState] ~ { XRGetFinalizationState: PROC [handle: Handle] RETURNS [state: FinalizationState] ~ TRUSTED MACHINE CODE { "XR_GetFinalizationState" }; RETURN[ XRGetFinalizationState[handle] ]; }; HandleToObject: PUBLIC PROC [handle: Handle] RETURNS [object: REF] ~ { XRHandleToObject: PROC [handle: Handle] RETURNS [object: REF] ~ TRUSTED MACHINE CODE { "XR_HandleToObject" }; RETURN[ XRHandleToObject[handle] ]; }; }.  FinalizationImpl.mesa Copyright Σ 1989, 1991 by Xerox Corporation. All rights reserved. Demers, March 27, 1989 2:35:09 pm PST Willie-Sue Orr, March 30, 1989 1:48:04 pm PST Willie-s, August 6, 1991 1:18 pm PDT Types FQ Manipulation Object Finalization Κέ–(cedarcode) style•NewlineDelimiter ™code™Kšœ Οeœ7™BK™%K™-K™$K˜—šΟk ˜ Kšœ ˜ K˜K˜—šΟnœžœž˜Kšžœ ˜K˜head™Kšœžœ"˜9K˜Kšœžœžœ˜%š œžœžœžœžœž œžœ˜BKšœ žœ˜Kšœ žœ˜K˜(Kšœ˜K˜K˜—Kšœžœžœ˜3šœžœžœžœ˜EK˜K˜Kšœ ž ˜Kšœ˜K˜——™šŸœžœžœžœ˜2Kš Ÿœžœžœžœžœžœ˜PKšžœ˜K˜K˜—š Ÿœžœžœžœžœ˜>KšŸ œžœžœžœžœžœžœ˜^Kšžœ˜K˜K˜—šŸ œžœžœžœ˜NKš Ÿœžœžœžœžœžœ˜tKšžœ˜K˜K˜—š Ÿœžœžœžœžœ˜MKš Ÿœžœžœžœžœžœ˜tKšœ˜Kš žœ žœžœžœžœ˜#K˜——™š Ÿœžœžœ žœžœ˜aKš Ÿœžœ žœ+žœžœžœ˜ƒKšœ žœ!žœ˜3Kšœ)˜)K˜K˜—šŸœžœžœžœ"˜[Kš Ÿœžœžœ!žœžœžœ˜‡Kšžœ"˜(K˜K˜—šŸœžœžœ)žœ"˜sKš Ÿœžœ)žœ!žœžœžœ˜ Kšžœ'˜-K˜K˜—šŸœžœžœžœ˜YKš Ÿœžœžœžœžœžœ˜†Kšžœ#˜)K˜K˜—š Ÿœžœžœžœ žœ˜FKšŸœžœžœ žœžœžœžœ˜mKšžœ˜#K˜K˜——K˜—K˜K˜—…— θΙ