home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549a.lha / M2P_v1.0 / mods.lzh / FStorage.mod < prev    next >
Text File  |  1991-08-10  |  4KB  |  219 lines

  1. (*======================================================================*)
  2.  
  3. IMPLEMENTATION MODULE FStorage;
  4.  
  5. IMPORT
  6.     SYSTEM;
  7.  
  8. IMPORT
  9.     Memory;
  10.  
  11.  
  12.  
  13.  
  14.  
  15.    (* I really trust this code :-) *)
  16.  
  17.  
  18.  
  19.  
  20.  
  21. (*----------------------------------------------------------------------*)
  22. (*  Memory Tracking list structure                                      *)
  23. (*----------------------------------------------------------------------*)
  24.  
  25. TYPE
  26.     TrackList = POINTER TO TrackNode;
  27.     TrackNode = RECORD
  28.         Next : TrackList;
  29.         Size : LONGCARD;
  30.     END;
  31.  
  32. CONST
  33.     TrackSize = SYSTEM.TSIZE(TrackNode);
  34.  
  35. VAR
  36.     Track : TrackList;
  37.  
  38. (*----------------------------------------------------------------------*)
  39. (*  Type definition for the FreeList.                                   *)
  40. (*----------------------------------------------------------------------*)
  41.  
  42. TYPE
  43.     ListRec = RECORD
  44.         Free : TrackList;
  45.         HowMany: CARDINAL;
  46.     END;
  47.  
  48. CONST
  49.     BlockSize = 4096;               (* Blocking factor (must be > MaxBlock) *)
  50.     MaxBlock = 512;                 (* Maximum size block using freelist    *)
  51.     Grain = 8;                      (* Allocations sizes are modulus Grain  *)
  52.  
  53. CONST
  54.     NumFreeLists = MaxBlock DIV Grain;
  55.  
  56. VAR
  57.     FreeList: ARRAY [1..NumFreeLists] OF ListRec;
  58.     i: CARDINAL;
  59.  
  60. (*----------------------------------------------------------------------*)
  61.  
  62. PROCEDURE ALLOCATE(VAR addr:SYSTEM.ADDRESS; amount: LONGCARD);
  63.  
  64. VAR
  65.     node : TrackList;
  66.     i: CARDINAL;
  67.     siz: SYSTEM.ADDRESS;
  68.  
  69. BEGIN
  70.     IF amount > MaxBlock THEN
  71.         addr:=NIL;
  72.         INC(amount,TrackSize);
  73.  
  74.         node:=Memory.AllocMem(amount,Memory.MemReqSet{Memory.MemPublic});
  75.         IF SYSTEM.ADDRESS(node) # SYSTEM.ADDRESS(0) THEN
  76.             node^.Size:=amount;
  77.             addr:=SYSTEM.ADDRESS(node);
  78.             INC(addr,TrackSize);
  79.             node^.Next:=Track;
  80.             Track:=node;
  81.         END;
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.     ELSIF amount=0 THEN
  93.         DISPOSEALL;
  94.         HALT;
  95.     ELSE
  96.         INC(amount,Grain-1);
  97.         i:=CARDINAL(amount) DIV Grain;
  98.         WITH FreeList[i] DO
  99.             IF Free = NIL THEN
  100.                 ALLOCATE(node,LONGCARD(BlockSize));
  101.                 IF node = NIL THEN
  102.                     addr:=NIL;
  103.                     RETURN;
  104.                 END;
  105.                 siz :=SYSTEM.ADDRESS(i*Grain);
  106.                 i := 0;
  107.                 WHILE i<HowMany DO
  108.                     node^.Next:=Free;
  109.                     Free:=node;
  110.                     node:=SYSTEM.ADDRESS(node)+siz;
  111.                     INC(i);
  112.                 END;
  113.             END;
  114.             addr:=Free;
  115.             Free:=Free^.Next;
  116.         END;
  117.     END;
  118. END ALLOCATE;
  119.  
  120. (*----------------------------------------------------------------------*)
  121.  
  122. PROCEDURE DEALLOCATE(VAR addr:SYSTEM.ADDRESS; amount: LONGCARD);
  123.  
  124. VAR
  125.     node,follow: TrackList;
  126.     i: CARDINAL;
  127.  
  128. BEGIN
  129.     IF addr # NIL THEN
  130.         IF amount > MaxBlock THEN
  131.             node:=Track;
  132.             DEC(addr,TrackSize);
  133.             WHILE (node # addr) AND (node # NIL) DO
  134.                 follow:=node;
  135.                 node:=follow^.Next;
  136.             END;
  137.             IF node # NIL THEN
  138.                 IF Track=node THEN
  139.                     Track:=node^.Next;
  140.                 ELSE
  141.                     follow^.Next:=node^.Next;
  142.                 END;
  143.  
  144.                 Memory.FreeMem(node,node^.Size);
  145.  
  146.  
  147.  
  148.             END;
  149.         ELSIF amount # 0 THEN
  150.             node:=addr;
  151.             INC(amount,Grain-1);
  152.             i:=CARDINAL(amount) DIV Grain;
  153.             WITH FreeList[i] DO
  154.                 node^.Next:=Free;
  155.                 Free:=node;
  156.             END;
  157.         END;
  158.         addr:=NIL;
  159.     END;
  160. END DEALLOCATE;
  161.  
  162. (*----------------------------------------------------------------------*)
  163.  
  164.  
  165.  
  166. PROCEDURE DUPLICATE(block: ARRAY OF SYSTEM.BYTE):SYSTEM.ADDRESS;
  167.  
  168. VAR
  169.     newblock: SYSTEM.ADDRESS;
  170.     i: CARDINAL;
  171.     ptr: POINTER TO SYSTEM.BYTE;
  172.  
  173. BEGIN
  174.     ALLOCATE(newblock,LONGCARD(HIGH(block)+1));
  175.     ptr:=newblock;
  176.     i:=0;
  177.     WHILE (i<=HIGH(block)) DO
  178.         ptr^:=block[i];
  179.         INC(i);
  180.         INC(ptr);
  181.     END;
  182.     RETURN newblock;
  183. END DUPLICATE;
  184.  
  185. (*----------------------------------------------------------------------*)
  186. (*  DISPOSALL   Walks the FreeList, disposing of all allocated memory.  *)
  187. (*----------------------------------------------------------------------*)
  188.  
  189. PROCEDURE DISPOSEALL();
  190.  
  191. VAR
  192.     next : TrackList;
  193.  
  194. BEGIN
  195.     WHILE Track # NIL DO
  196.         next:=Track^.Next;
  197.  
  198.         Memory.FreeMem(Track,Track^.Size);
  199.  
  200.  
  201.  
  202.         Track:=next;
  203.     END;
  204. END DISPOSEALL;
  205.  
  206. (************************************************************************)
  207. (*  MAIN INITIALIZATION CODE                                            *)
  208. (************************************************************************)
  209.  
  210. BEGIN
  211.     Track:=NIL;
  212.     FOR i:= 1 TO NumFreeLists DO
  213.         WITH FreeList[i] DO
  214.             Free := NIL;
  215.             HowMany := BlockSize DIV (i*Grain);
  216.         END;
  217.     END;
  218. END FStorage.
  219.