<> <> <> DIRECTORY CountedVM, PrincOps, Process, SafeStorage, VM; CountedVMImpl: CEDAR MONITOR IMPORTS Process, SafeStorage, VM EXPORTS CountedVM ~ BEGIN Handle: TYPE ~ CountedVM.Handle; Object: TYPE ~ CountedVM.Object; Allocate: PUBLIC PROCEDURE [words: INT, partition: VM.VMPartition, subRange: VM.Interval, start: VM.PageNumber, alignment: VM.LogPageCount, in64K: BOOL] RETURNS [h: Handle] ~ BEGIN count: VM.PageCount ~ MAX[words+(PrincOps.wordsPerPage-1), 0]/PrincOps.wordsPerPage; interval: VM.Interval ~ VM.Allocate[count: count, partition: partition, subRange: subRange, start: start, alignment: alignment, in64K: in64K]; h _ NEW[Object _ [interval: interval]]; SafeStorage.EnableFinalization[h]; END; finalizationQueue: SafeStorage.FinalizationQueue _ SafeStorage.NewFQ[]; FinalizationProcess: PROCEDURE ~ BEGIN DO h: Handle _ NARROW[SafeStorage.FQNext[finalizationQueue]]; TRUSTED {VM.Free[h.interval]}; h _ NIL; ENDLOOP; END; SafeStorage.EstablishFinalization[Object.CODE, 0, finalizationQueue]; TRUSTED {Process.Detach[FORK FinalizationProcess]}; END.