-- File: MSegmentOnNSSegmentImpl.mesa Edited by -- Breisacher.es 31-Jan-86 15:32:39 -- MEW 11-Apr-86 7:45:38 -- Copyright (C) 1985, 1986 by Xerox Corporation. All rights reserved. DIRECTORY Environment, Heap, File, MFile, MFileOnNSFileOps, MSegment, NSSegment, Space; MSegmentOnNSSegmentImpl: PROGRAM IMPORTS Heap, MFile, MFileOnNSFileOps, NSSegment, Space EXPORTS MSegment = BEGIN OPEN MSegment; Handle: TYPE = LONG POINTER TO Object; Object: PUBLIC TYPE = RECORD [ mfh: MFile.Handle, fileBase: File.PageNumber, interval: Space.Interval]; zone: UNCOUNTED ZONE ¬ Heap.Create [initial: 1]; NotImplemented: ERROR = CODE; << MSegment EXPORTS >> Error: PUBLIC ERROR [segment: Handle, code: ErrorCode] = CODE; Activate: PUBLIC PROCEDURE [segment: Handle] = {ERROR NotImplemented}; Address: PUBLIC PROCEDURE [segment: Handle] RETURNS [LONG POINTER] = { RETURN [segment.interval.pointer]}; AddresstoSegment: PUBLIC PROCEDURE [pointer: LONG POINTER] RETURNS [Handle] = {ERROR NotImplemented}; Base: PUBLIC PROCEDURE [segment: Handle] RETURNS [Environment.PageNumber] = {ERROR NotImplemented}; BasetoSegment: PUBLIC PROCEDURE [page: Environment.PageNumber] RETURNS [Handle] = {ERROR NotImplemented}; CopyIn: PUBLIC PROCEDURE [ segment: Handle, file: MFile.Handle, fileBase: File.PageNumber, count: Environment.PageCount] = { [] ¬ NSSegment.CopyIn [pointer: segment.interval.pointer, origin: [ file: MFileOnNSFileOps.NSHandleFromMFHandle [file], base: fileBase, count: count]]; }; CopyOut: PUBLIC PROCEDURE [ segment: Handle, file: MFile.Handle, fileBase: File.PageNumber, count: Environment.PageCount] = {ERROR NotImplemented}; CopySegment: PUBLIC PROCEDURE [segment: Handle] RETURNS [newSegment: Handle] = {ERROR NotImplemented}; Create: PUBLIC PROCEDURE [ file: MFile.Handle ¬ NIL, release: ReleaseData, fileBase: File.PageNumber ¬ 0, pages: Environment.PageCount ¬ defaultPages, swapInfo: SwapUnitOption ¬ defaultSwapUnitOption, usage: Space.Usage ¬ Space.unknownUsage] RETURNS [segment: Handle] = { segment ¬ zone.NEW [Object ¬ [mfh: file, fileBase: fileBase, interval: Space.nullInterval]]; CreateInternal [segment, file, release, fileBase, pages, swapInfo, usage]; }; CreateInternal: PROCEDURE [ segment: Handle, file: MFile.Handle ¬ NIL, release: ReleaseData, fileBase: File.PageNumber ¬ 0, pages: Environment.PageCount ¬ defaultPages, swapInfo: SwapUnitOption ¬ defaultSwapUnitOption, usage: Space.Usage ¬ Space.unknownUsage] = { segment.interval ¬ IF file = NIL THEN [Space.ScratchMap [pages, usage], pages] ELSE NSSegment.Map [ origin: [ file: MFileOnNSFileOps.NSHandleFromMFHandle [file], base: fileBase, count: pages], usage: usage, swapUnits: swapInfo]; }; Deactivate: PUBLIC PROCEDURE [segment: Handle] = {ERROR NotImplemented}; Delete: PUBLIC PROCEDURE [segment: Handle] = { [] ¬ Space.Unmap [segment.interval.pointer]; IF segment.mfh # NIL THEN MFile.Release[segment.mfh]; zone.FREE [@segment]; }; EquivalentSegments: PUBLIC PROCEDURE [seg1, seg2: Handle] RETURNS [BOOLEAN] = {ERROR NotImplemented}; ForceOut: PUBLIC PROCEDURE [segment: Handle] = {Space.ForceOut [segment.interval]}; GetFile: PUBLIC PROCEDURE [segment: Handle] RETURNS [MFile.Handle] = {RETURN [segment.mfh]}; GetFileBase: PUBLIC PROCEDURE [segment: Handle] RETURNS [File.PageNumber] = {RETURN [segment.fileBase]}; GetFilePages: PUBLIC PROCEDURE [segment: Handle] RETURNS [File.PageCount] = { RETURN [NSSegment.GetSizeInPages [ MFileOnNSFileOps.NSHandleFromMFHandle [segment.mfh]]]; }; GetReleaseData: PUBLIC PROCEDURE [segment: Handle] RETURNS [ReleaseData] = {ERROR NotImplemented}; Kill: PUBLIC PROCEDURE [segment: Handle] = {ERROR NotImplemented}; MakeReadOnly: PUBLIC PROCEDURE [segment: Handle] = {ERROR NotImplemented}; MakeWritable: PUBLIC PROCEDURE [segment: Handle] = {ERROR NotImplemented}; Pages: PUBLIC PROCEDURE [segment: Handle] RETURNS [Environment.PageCount] = {RETURN [segment.interval.count]}; Reset: PUBLIC PROCEDURE [ segment: Handle, file: MFile.Handle ¬ dontChangeFile, release: ReleaseData ¬ dontChangeReleaseData, fileBase: File.PageNumber ¬ dontChangeFileBase, pages: Environment.PageCount ¬ dontChangePages, swapInfo: SwapUnitOption ¬ defaultSwapUnitOption, usage: Space.Usage ¬ dontChangeUsage] = { IF file = dontChangeFile THEN file ¬ segment.mfh; IF fileBase = dontChangeFileBase THEN fileBase ¬ segment.fileBase; IF pages = dontChangePages THEN pages ¬ segment.interval.count; « Kludgy impl, I guess, but it's easy. Just delete the old one and create a new one basically. » [] ¬ Space.Unmap [segment.interval.pointer]; segment.mfh ¬ file; segment.fileBase ¬ fileBase; CreateInternal [segment, file, release, fileBase, pages, swapInfo, usage]; }; SetReleaseData: PUBLIC PROCEDURE [segment: Handle, release: ReleaseData] = {}; GetPages: PUBLIC PROCEDURE [npages: CARDINAL] RETURNS [base: LONG POINTER] = {ERROR NotImplemented}; GetWords: PUBLIC PROCEDURE [nwords: CARDINAL] RETURNS [base: LONG POINTER] = {ERROR NotImplemented}; FreePages, FreeWords: PUBLIC PROCEDURE [base: LONG POINTER] = {ERROR NotImplemented}; END. MSegment To Definitely Impl: Address, Create, CopyIn, Delete, GetFilePages To Maybe Impl: