-- HeapMemoryImpl.mesa -- Last changed by Doug Wyatt, September 26, 1980 12:30 AM DIRECTORY Memory, InlineDefs USING [LowHalf], SystemDefs USING [AllocateHeapNode, FreeHeapNode]; MemoryImpl: PROGRAM IMPORTS InlineDefs,SystemDefs EXPORTS Memory = { UZHandle: TYPE = LONG POINTER TO UZObject; UZObject: TYPE = MACHINE DEPENDENT RECORD [ procs: LONG POINTER TO UZProcs, data: LONG POINTER TO UZData ]; UZProcs: TYPE = MACHINE DEPENDENT RECORD [ alloc: PROC[zone: UZHandle, size: CARDINAL] RETURNS[LONG POINTER], dealloc: PROC[zone: UZHandle, object: LONG POINTER] ]; UZData: TYPE = RECORD[]; nodes: INTEGER_0; UZAlloc: PROC[zone: UZHandle, size: CARDINAL] RETURNS[LONG POINTER] = { nodes_nodes+1; RETURN[SystemDefs.AllocateHeapNode[size]]; }; UZDeAlloc: PROC[zone: UZHandle, object: LONG POINTER] = { nodes_nodes-1; SystemDefs.FreeHeapNode[InlineDefs.LowHalf[object]]; }; uzprocs: UZProcs _ [alloc: UZAlloc, dealloc: UZDeAlloc]; uzobject: UZObject _ [procs: @uzprocs, data: NIL]; uzhandle: UZHandle = @uzobject; MDSHandle: TYPE = POINTER TO MDSObject; MDSObject: TYPE = MACHINE DEPENDENT RECORD [ procs: POINTER TO MDSProcs, data: POINTER TO MDSData ]; MDSProcs: TYPE = MACHINE DEPENDENT RECORD [ alloc: PROC[zone: MDSHandle, size: CARDINAL] RETURNS[POINTER], dealloc: PROC[zone: MDSHandle, object: POINTER] ]; MDSData: TYPE = RECORD[]; MDSAlloc: PROC[zone: MDSHandle, size: CARDINAL] RETURNS[POINTER] = { RETURN[SystemDefs.AllocateHeapNode[size]]; }; MDSDeAlloc: PROC[zone: MDSHandle, object: POINTER] = { SystemDefs.FreeHeapNode[object]; }; mdsprocs: MDSProcs _ [alloc: MDSAlloc, dealloc: MDSDeAlloc]; mdsobject: MDSObject _ [procs: @mdsprocs, data: NIL]; mdshandle: MDSHandle = @mdsobject; zone: UNCOUNTED ZONE _ LOOPHOLE[uzhandle]; NewZone: PUBLIC PROC[STRING] RETURNS[UNCOUNTED ZONE] = { RETURN[zone] }; mds: PUBLIC MDSZone _ LOOPHOLE[mdshandle]; }.(670)