home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / bpos2tv.zip / MEMORY.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-09  |  5KB  |  208 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Turbo Pascal Version 7.0                        }
  5. {       Turbo Vision Unit                               }
  6. {                                                       }
  7. {       Copyright (c) 1992 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit Memory;
  12.  
  13. {$O+,F+,X+,I-,S-,Q-}
  14.  
  15. interface
  16.  
  17. const
  18.   MaxHeapSize: Longint = $100000;          {  16M }
  19.   LowMemSize: Word = 4096 div 16;       {   4K }
  20.   MaxBufMem: Word = 65536 div 16;       {  64K }
  21.  
  22. procedure InitMemory;
  23. procedure DoneMemory;
  24. procedure InitDosMem;
  25. procedure DoneDosMem;
  26. function LowMemory: Boolean;
  27. function MemAlloc(Size: Word): Pointer;
  28. function MemAllocSeg(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. implementation
  37.  
  38. uses
  39.   OS2Def, BSEDos;
  40.  
  41. type
  42.   PtrRec = record
  43.     Ofs, Seg: Word;
  44.   end;
  45.  
  46. type
  47.   PCache = ^TCache;
  48.   TCache = record
  49.     Next: PCache;
  50.     Master: ^Pointer;
  51.     Data: record end;
  52.   end;
  53.  
  54. const
  55.   CacheList: PCache = nil;
  56.   SafetyPool: Pointer = nil;
  57.   SafetyPoolSize: Word = 0;
  58.   DisablePool: Boolean = False;
  59.  
  60. function FreeCache: Boolean;
  61. begin
  62.   FreeCache := False;
  63.   if CacheList <> nil then
  64.   begin
  65.     DisposeCache(CacheList^.Next^.Master^);
  66.     FreeCache := True;
  67.   end;
  68. end;
  69.  
  70. function FreeSafetyPool: Boolean;
  71. begin
  72.   FreeSafetyPool := False;
  73.   if SafetyPool <> nil then
  74.   begin
  75.     FreeMem(SafetyPool, SafetyPoolSize);
  76.     SafetyPool := nil;
  77.     FreeSafetyPool := True;
  78.   end;
  79. end;
  80.  
  81. function HeapNotify(Size: Word): Integer; far;
  82. begin
  83.   if FreeCache then HeapNotify := 2 else
  84.     if DisablePool then HeapNotify := 1 else
  85.       if FreeSafetyPool then HeapNotify := 2 else HeapNotify := 0;
  86. end;
  87.  
  88. procedure InitMemory;
  89. begin
  90.   HeapError := @HeapNotify;
  91.   SafetyPoolSize := LowMemSize * 16;
  92.   LowMemory;
  93. end;
  94.  
  95. procedure DoneMemory;
  96. begin
  97.   while FreeCache do;
  98.   FreeSafetyPool;
  99. end;
  100.  
  101. procedure InitDosMem;
  102. begin
  103. end;
  104.  
  105. procedure DoneDosMem;
  106. begin
  107. end;
  108.  
  109. function LowMemory: Boolean;
  110. begin
  111.   LowMemory := False;
  112.   if SafetyPool = nil then
  113.   begin
  114.     SafetyPool := MemAlloc(SafetyPoolSize);
  115.     if SafetyPool = nil then LowMemory := True;
  116.   end;
  117. end;
  118.  
  119. function MemAlloc(Size: Word): Pointer;
  120. var
  121.   P: Pointer;
  122. begin
  123.   DisablePool := True;
  124.   GetMem(P, Size);
  125.   DisablePool := False;
  126.   MemAlloc := P;
  127. end;
  128.  
  129. function MemAllocSeg(Size: Word): Pointer;
  130. var
  131.   Selector: Word;
  132. begin
  133.   Selector := 0;
  134.   if Size <> 0 then
  135.     repeat
  136.       if DosAllocSeg(Size, @Selector, 0) <> 0 then
  137.         Selector := 0;
  138.     until (Selector <> 0) or not FreeCache;
  139.   MemAllocSeg := Ptr(Selector, 0);
  140. end;
  141.  
  142. procedure NewCache(var P: Pointer; Size: Word);
  143. var
  144.   Cache: PCache;
  145. begin
  146.   Inc(Size, SizeOf(TCache));
  147.   PtrRec(Cache).Ofs := 0;
  148.   if DosAllocSeg(Size, @PtrRec(Cache).Seg, 0) <> 0 then
  149.     PtrRec(Cache).Seg := 0;
  150.   if Cache <> nil then
  151.   begin
  152.     if CacheList = nil then Cache^.Next := Cache else
  153.     begin
  154.       Cache^.Next := CacheList^.Next;
  155.       CacheList^.Next := Cache;
  156.     end;
  157.     CacheList := Cache;
  158.     Cache^.Master := @P;
  159.     Inc(PtrRec(Cache).Ofs, SizeOf(TCache));
  160.   end;
  161.   P := Cache;
  162. end;
  163.  
  164. procedure DisposeCache(P: Pointer);
  165. var
  166.   Cache, C: PCache;
  167. begin
  168.   PtrRec(Cache).Ofs := PtrRec(P).Ofs - SizeOf(TCache);
  169.   PtrRec(Cache).Seg := PtrRec(P).Seg;
  170.   C := CacheList;
  171.   while (C^.Next <> Cache) and (C^.Next <> CacheList) do C := C^.Next;
  172.   if C^.Next = Cache then
  173.   begin
  174.     if C = Cache then CacheList := nil else
  175.     begin
  176.       if CacheList = Cache then CacheList := C;
  177.       C^.Next := Cache^.Next;
  178.     end;
  179.     Cache^.Master^ := nil;
  180.     DosFreeSeg(PtrRec(Cache).Seg);
  181.   end;
  182. end;
  183.  
  184. procedure NewBuffer(var P: Pointer; Size: Word);
  185. begin
  186.   P := MemAllocSeg(Size);
  187. end;
  188.  
  189. procedure DisposeBuffer(P: Pointer);
  190. begin
  191.   DosFreeSeg(PtrRec(P).Seg);
  192. end;
  193.  
  194. function GetBufferSize(P: Pointer): Word;
  195. var
  196.   Size: Longint;
  197. begin
  198.   if DosSizeSeg(PtrRec(P).Seg, @Size) <> 0 then Size := 0;
  199.   GetBufferSize := Size;
  200. end;
  201.  
  202. function SetBufferSize(P: Pointer; Size: Word): Boolean;
  203. begin
  204.   SetBufferSize := DosReallocSeg(Size, PtrRec(P).Seg) = 0;
  205. end;
  206.  
  207. end.
  208.