<<>> <> <> <> <> <> <> <<>> Finalize: CEDAR DEFINITIONS ~ BEGIN <> Handle: TYPE ~ REF FinalizableObject; FinalizableObject: TYPE; <<>> FinalizationQueue: TYPE ~ REF FinalizationQueueRep; FinalizationQueueRep: TYPE; FinalizationState: TYPE ~ MACHINE DEPENDENT { enabled(0), -- waiting for all REFs to disappear onFQ(1), -- on a finalization queue disabled(2), -- none of the above error(CARDINAL.LAST) }; <<>> <> <<>> <> <<>> <> <<- A handle in the enabled state is awaiting finalization. It will remain in the enabled state until there are no remaining undisguised REFs or non-enabled handles referring to its object; the system will then put the handle on its associated FinalizationQueue and change its state to onFQ.>> <<- A handle in the onFQ state is on a FinalizationQueue. It will remain there until removed, either explicitly using FQNext, or implicitly by DisableFinalization or ReenableFinalization.>> <<- A handle in the disabled state is neither awaiting finalization nor on a FinalizationQueue. Such a handle can still be converted to a REF (using HandleToObject), and it prevents the associated object from being garbage collected or finalized (even if there is some other handle in the enabled state).>> <<>> IsHandle: PROC [x: REF] RETURNS [BOOL]; <> <<>> NarrowHandle: PROC [x: REF] RETURNS [Handle]; <> <<>> <> EnableFinalization: PROC [object: REF, fq: FinalizationQueue, clientData: REF ¬ NIL] RETURNS [handle: Handle]; <> <<>> DisableFinalization: PROC [handle: Handle] RETURNS [oldState: FinalizationState]; <> <> ReenableFinalization: PROC [handle: Handle, fq: FinalizationQueue] RETURNS [oldState: FinalizationState]; <> <> GetFinalizationState: PROC [handle: Handle] RETURNS [state: FinalizationState]; <> HandleToObject: PROC [handle: Handle] RETURNS [object: REF]; <> <<>> GetClientData: PROC [handle: Handle] RETURNS [REF]; <> <> NewFQ: PROC RETURNS [FinalizationQueue]; <> FQNext: PROC [fq: FinalizationQueue] RETURNS[handle: Handle]; <> FQNextNoAbort: PROC [fq: FinalizationQueue] RETURNS[handle: Handle ¬ NIL]; <> <<>> FQEmpty: PROC [fq: FinalizationQueue] RETURNS[BOOL]; <> END.