-- Copyright (C) 1982 by Xerox Corporation. All rights reserved. -- ServerHeaps.mesa, HGM, 9-Mar-82 19:57:24 DIRECTORY Heap USING [Create, Delete], ServerHeap USING []; ServerHeaps: MONITOR IMPORTS Heap EXPORTS ServerHeap = BEGIN DummyType: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF WORD]; ZoneAlreadyCreated: PUBLIC ERROR = CODE; ZoneNotCreated: PUBLIC ERROR = CODE; ZoneNotEmpty: PUBLIC ERROR = CODE; ZoneScrambled: PUBLIC ERROR = CODE; nodeCount: CARDINAL ¬ 0; z: UNCOUNTED ZONE ¬ NIL; Create: PUBLIC ENTRY PROCEDURE = BEGIN IF z # NIL THEN ERROR ZoneAlreadyCreated; z ¬ Heap.Create[initial: 1, threshold: 8]; END; Destroy: PUBLIC ENTRY PROCEDURE = BEGIN IF z = NIL THEN ERROR ZoneNotCreated; IF nodeCount > 0 THEN ERROR ZoneNotEmpty; Heap.Delete[z]; z ¬ NIL; END; Node: PUBLIC ENTRY PROCEDURE [n: CARDINAL] RETURNS [p: LONG POINTER] = BEGIN IF z = NIL THEN ERROR ZoneNotCreated; nodeCount ¬ nodeCount + 1; p ¬ z.NEW[DummyType [n]]; END; CopyString: PUBLIC PROCEDURE [s: LONG STRING] RETURNS [copy: LONG STRING] = BEGIN IF z = NIL THEN ERROR ZoneNotCreated; nodeCount ¬ nodeCount + 1; copy ¬ z.NEW[StringBody [s.length]]; FOR i: CARDINAL IN [0..s.length) DO copy[i] ¬ s[i] ENDLOOP; copy.length ¬ s.length; END; Free, FreeString: PUBLIC ENTRY PROCEDURE [p: LONG POINTER] = BEGIN IF z = NIL THEN ERROR ZoneNotCreated; IF nodeCount = 0 THEN ERROR ZoneScrambled; nodeCount ¬ nodeCount - 1; z.FREE[@p]; END; END.