home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1989-11-02 | 2.3 KB | 86 lines |
- (* ------------------------------------------------------ *)
- (* STORAGE.DEF *)
- (* Die folgenden Deklarationen werden im Definitionsmodul *)
- (* Storage eingefügt. *)
- (* (c) 1989 Cornelis van der Laan & TOOLBOX *)
- (* ------------------------------------------------------ *)
- DEFINITION MODULE Storage;
-
- (* .... *)
-
- PROCEDURE Mark;
-
- PROCEDURE Release;
-
- END Storage.
- (* ------------------------------------------------------ *)
- (* Ende von STORAGE.DEF *)
-
-
- (* ------------------------------------------------------ *)
- (* STORAGE.MOD *)
- (* ------------------------------------------------------ *)
- IMPLEMENTATION MODULE Storage;
-
- (* ............. *)
-
- FROM Lib IMPORT
- FatalError;
-
- TYPE
- TMarkList = POINTER TO TMark;
- TMark = RECORD
- Heap : HeapRecPtr;
- Big : CARDINAL;
- Next : TMarkList;
- END;
- VAR
- MarkList : TMarkList;
-
- PROCEDURE Mark;
- TYPE
- DummTyp = RECORD
- CASE : BOOLEAN OF
- | TRUE : Adr : ADDRESS;
- | FALSE : Off, Seg : CARDINAL;
- END;
- END;
- VAR
- P : TMarkList;
- Len : CARDINAL;
- Dummy : DummTyp;
- BEGIN
- NEW(P);
- Len := HeapAvail(MainHeap);
- HeapAllocate (MainHeap, Dummy.Adr, Len);
- P^.Heap := MakeHeap (Dummy.Seg, Len);
- P^.Big := Len;
- P^.Next := MarkList;
- MarkList := P;
- MainHeap := P^.Heap;
- END Mark;
-
- PROCEDURE Release;
- VAR
- P : TMarkList;
- BEGIN
- P := MarkList;
- IF MarkList^.Next = NIL THEN
- FatalError ('Invalid Release')
- ELSE MarkList := MarkList^.Next
- END;
- MainHeap := MarkList^.Heap;
- HeapDeallocate (MainHeap, P^.Heap, P^.Big);
- DISPOSE (P);
- END Release;
-
- BEGIN
- HeapInit; (* ALT *)
- NEW (MarkList); (* Initialisierung der Heap-Liste *)
- WITH MarkList^ DO
- Heap := MainHeap; Next := NIL;
- END;
- END Storage.
- (* ------------------------------------------------------ *)
- (* Ende von STORAGE.MOD *)