home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vp21beta.zip / ATVSRC.RAR / MEMORY.PAS < prev    next >
Pascal/Delphi Source File  |  2000-08-15  |  5KB  |  235 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Turbo Pascal Version 7.0                        }
  5. {       Turbo Vision Unit                               }
  6. {                                                       }
  7. {       Copyright (c) 1992 Borland International        }
  8. {                                                       }
  9. {       Virtual Pascal v2.1                             }
  10. {       Copyright (C) 1996-2000 vpascal.com             }
  11. {                                                       }
  12. {*******************************************************}
  13.  
  14. unit Memory;
  15.  
  16. {$X+,I-,S-,Q-,Use32+}
  17.  
  18. interface
  19.  
  20. const
  21.   LowMemSize: Word = 4096 div 16;       {   4K }
  22.  
  23. procedure InitMemory;
  24. procedure DoneMemory;
  25. procedure InitDosMem;
  26. procedure DoneDosMem;
  27. function LowMemory: Boolean;
  28. function MemAlloc(Size: Word): Pointer;
  29. procedure NewCache(var P: Pointer; Size: Word);
  30. procedure DisposeCache(P: Pointer);
  31. procedure NewBuffer(var P: Pointer; Size: Word);
  32. procedure DisposeBuffer(P: Pointer);
  33. function GetBufferSize(P: Pointer): Word;
  34. function SetBufferSize(P: Pointer; Size: Word): Boolean;
  35.  
  36. { The following procedure is not implemented
  37.  
  38. function MemAllocSeg(Size: Word): Pointer;
  39.  
  40. }
  41.  
  42. implementation
  43.  
  44. type
  45.   PtrRec = record
  46.     Ofs: Longint;
  47.   end;
  48.  
  49. type
  50.   PCache = ^TCache;
  51.   TCache = record
  52.     Next: PCache;
  53.     Master: ^Pointer;
  54.     Size: Word;
  55.     Data: record end;
  56.   end;
  57.  
  58.   PBuffer = ^TBuffer;
  59.   TBuffer = record
  60.     Next: PBuffer;
  61.     Size: Word;
  62.     Data: record end;
  63.   end;
  64.  
  65. const
  66.   CacheList: PCache = nil;
  67.   SafetyPool: Pointer = nil;
  68.   BufferList: PBuffer = nil;
  69.   SafetyPoolSize: Word = 0;
  70.   DisablePool: Boolean = False;
  71.  
  72. function FreeCache: Boolean;
  73. begin
  74.   FreeCache := False;
  75.   if CacheList <> nil then
  76.   begin
  77.     DisposeCache(CacheList^.Next^.Master^);
  78.     FreeCache := True;
  79.   end;
  80. end;
  81.  
  82. function FreeSafetyPool: Boolean;
  83. begin
  84.   FreeSafetyPool := False;
  85.   if SafetyPool <> nil then
  86.   begin
  87.     FreeMem(SafetyPool, SafetyPoolSize);
  88.     SafetyPool := nil;
  89.     FreeSafetyPool := True;
  90.   end;
  91. end;
  92.  
  93. function HeapNotify(Size: Word): Integer;
  94. begin
  95.   if FreeCache then HeapNotify := 2 else
  96.     if DisablePool then HeapNotify := 1 else
  97.       if FreeSafetyPool then HeapNotify := 2 else HeapNotify := 0;
  98. end;
  99.  
  100. procedure InitMemory;
  101. begin
  102.   HeapError := @HeapNotify;
  103.   SafetyPoolSize := LowMemSize * 16;
  104.   LowMemory;
  105. end;
  106.  
  107. procedure DoneMemory;
  108. begin
  109.   while FreeCache do;
  110.   FreeSafetyPool;
  111. end;
  112.  
  113. procedure InitDosMem;
  114. begin
  115. end;
  116.  
  117. procedure DoneDosMem;
  118. begin
  119. end;
  120.  
  121. function LowMemory: Boolean;
  122. begin
  123.   LowMemory := False;
  124.   if SafetyPool = nil then
  125.   begin
  126.     SafetyPool := MemAlloc(SafetyPoolSize);
  127.     if SafetyPool = nil then LowMemory := True;
  128.   end;
  129. end;
  130.  
  131. function MemAlloc(Size: Word): Pointer;
  132. var
  133.   P: Pointer;
  134. begin
  135.   DisablePool := True;
  136.   GetMem(P, Size);
  137.   DisablePool := False;
  138.   MemAlloc := P;
  139. end;
  140.  
  141. procedure NewCache(var P: Pointer; Size: Word);
  142. var
  143.   Cache: PCache;
  144. begin
  145.   Inc(Size, SizeOf(TCache));
  146.   if MaxAvail >= Size then GetMem(Cache,Size) else Cache := nil;
  147.   if Cache <> nil then
  148.   begin
  149.     if CacheList = nil then Cache^.Next := Cache else
  150.     begin
  151.       Cache^.Next := CacheList^.Next;
  152.       CacheList^.Next := Cache;
  153.     end;
  154.     CacheList := Cache;
  155.     Cache^.Master := @P;
  156.     Cache^.Size := Size;
  157.     Inc(PtrRec(Cache).Ofs, SizeOf(TCache));
  158.   end;
  159.   P := Cache;
  160. end;
  161.  
  162. procedure DisposeCache(P: Pointer);
  163. var
  164.   Cache, C: PCache;
  165. begin
  166.   PtrRec(Cache).Ofs := PtrRec(P).Ofs - SizeOf(TCache);
  167.   C := CacheList;
  168.   while (C^.Next <> Cache) and (C^.Next <> CacheList) do C := C^.Next;
  169.   if C^.Next = Cache then
  170.   begin
  171.     if C = Cache then CacheList := nil else
  172.     begin
  173.       if CacheList = Cache then CacheList := C;
  174.       C^.Next := Cache^.Next;
  175.     end;
  176.     Cache^.Master^ := nil;
  177.     FreeMem(Cache,Cache^.Size);
  178.   end;
  179. end;
  180.  
  181. procedure NewBuffer(var P: Pointer; Size: Word);
  182. var
  183.   Buffer: PBuffer;
  184. begin
  185.   Inc(Size, SizeOf(TBuffer));
  186.   Buffer := MemAlloc(Size);
  187.   if Buffer <> nil then
  188.   begin
  189.     Buffer^.Next := BufferList;
  190.     Buffer^.Size := Size;
  191.     BufferList := Buffer;
  192.     Inc(PtrRec(Buffer).Ofs, SizeOf(TBuffer));
  193.   end;
  194.   P := Buffer;
  195. end;
  196.  
  197. procedure DisposeBuffer(P: Pointer);
  198. var
  199.   Buffer,PrevBuf: PBuffer;
  200. begin
  201.   if P <> nil then
  202.   begin
  203.     Dec(PtrRec(P).Ofs, SizeOf(TBuffer));
  204.     Buffer := BufferList;
  205.     PrevBuf := nil;
  206.     while (Buffer <> nil) and (P <> Buffer) do
  207.     begin
  208.       PrevBuf := Buffer;
  209.       Buffer := Buffer^.Next;
  210.     end;
  211.     if Buffer <> nil then
  212.     begin
  213.       if PrevBuf = nil then BufferList := Buffer^.Next else PrevBuf^.Next := Buffer^.Next;
  214.       FreeMem(Buffer,Buffer^.Size);
  215.     end;
  216.   end;
  217. end;
  218.  
  219. function GetBufferSize(P: Pointer): Word;
  220. begin
  221.   if P = nil then GetBufferSize := 0
  222.  else
  223.   begin
  224.     Dec(PtrRec(P).Ofs,SizeOf(TBuffer));
  225.     GetBufferSize := PBuffer(P)^.Size;
  226.   end;
  227. end;
  228.  
  229. function SetBufferSize(P: Pointer; Size: Word): Boolean;
  230. begin
  231.   SetBufferSize := False;
  232. end;
  233.  
  234. end.
  235.