home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / Heap.mod < prev    next >
Text File  |  1995-05-13  |  2KB  |  88 lines

  1. IMPLEMENTATION MODULE Heap;
  2.  
  3. (* (C) Copyright 1994 Marcel Timmermans. All rights reserved. *)
  4.  
  5. FROM SYSTEM IMPORT ADDRESS,ADR,CAST;
  6. IMPORT ml:ModulaLib,
  7.        el:ExecL,
  8.        ed:ExecD;
  9.  
  10. CONST
  11.   oom="You are out of memory!!";
  12.  
  13. TYPE
  14.     BlockPtr = POINTER TO Block;
  15.     Block = RECORD
  16.               blksize : LONGINT;
  17.               next    : BlockPtr;
  18.             END;
  19.  
  20. VAR
  21.  First:BlockPtr;
  22.  
  23. PROCEDURE AllocMem(VAR Adr:ADDRESS; size:LONGINT; mrChip:BOOLEAN);
  24. VAR blk:BlockPtr;
  25.     mr:ed.MemReqSet;
  26. BEGIN
  27.  Adr:=NIL;
  28.  IF size>0 THEN
  29.   mr:=ed.MemReqSet{ed.memClear};
  30.   IF mrChip THEN INCL(mr,ed.chip); ELSE INCL(mr,ed.public) END;
  31.   INC(size,SIZE(Block)); (* reserve also memory for memhandler *)
  32.   blk:=el.AllocMem(size,mr);
  33.   IF blk#NIL THEN
  34.     WITH blk^ DO
  35.      blksize:=size;
  36.      next:=First;
  37.     END;
  38.     First:=blk;
  39.     Adr:=LONGINT(blk)+SIZE(Block);
  40.   END;
  41.  END;
  42. END AllocMem;
  43.  
  44. PROCEDURE Allocate(VAR Adr:ADDRESS; size:LONGINT);
  45. BEGIN
  46.  AllocMem(Adr,size,FALSE);
  47. END Allocate;
  48.  
  49. PROCEDURE Deallocate(VAR Adr:ADDRESS);
  50. VAR prev,curr,act:BlockPtr;
  51. BEGIN
  52.   IF Adr=NIL THEN RETURN END;
  53.   curr:=First; prev:=NIL;
  54.   act:=CAST(BlockPtr,Adr-SIZE(Block));
  55.   WHILE (curr#NIL) & (act#curr) DO
  56.    prev:=curr;
  57.    curr:=curr^.next;
  58.   END;
  59.   IF (prev=NIL) & (curr#NIL) THEN
  60.     First:=curr^.next;
  61.   ELSIF (curr#NIL) THEN 
  62.     prev^.next:=curr^.next;
  63.   END;
  64.   IF curr#NIL THEN
  65.     el.FreeMem(curr,curr^.blksize);
  66.     Adr:=NIL;
  67.   END;
  68. END Deallocate;
  69.  
  70. PROCEDURE CleanHeap;
  71. VAR prev,act:BlockPtr;
  72. BEGIN
  73.   act:=First;
  74.   WHILE act#NIL DO
  75.     prev:=act;
  76.     act:=act^.next;
  77.     el.FreeMem(prev,prev^.blksize);
  78.   END;
  79.   First:=NIL;
  80. END CleanHeap;
  81.  
  82.  
  83. BEGIN
  84.  First:=NIL;
  85. CLOSE
  86.  CleanHeap;
  87. END Heap.
  88.