Explorar o código

* GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize

peter %!s(int64=20) %!d(string=hai) anos
pai
achega
a263b1d40e
Modificáronse 10 ficheiros con 174 adicións e 191 borrados
  1. 26 1
      compiler/cclasses.pas
  2. 20 9
      compiler/comphook.pas
  3. 13 2
      compiler/compiler.pas
  4. 5 1
      compiler/options.pas
  5. 13 1
      ide/fpcompil.pas
  6. 7 18
      rtl/inc/cmem.pp
  7. 42 103
      rtl/inc/heap.inc
  8. 21 14
      rtl/inc/heaph.inc
  9. 19 23
      rtl/inc/heaptrc.pp
  10. 8 19
      rtl/inc/objects.pp

+ 26 - 1
compiler/cclasses.pas

@@ -369,18 +369,40 @@ implementation
 
 
 
 
     procedure tmemdebug.start;
     procedure tmemdebug.start;
+{$ifdef HASGETHEAPSTATUS}
+      var
+        status : THeapStatus;
+{$endif HASGETHEAPSTATUS}
       begin
       begin
+{$ifdef HASGETHEAPSTATUS}
+        GetHeapStatus(status);
+        startmem:=status.CurrHeapUsed;
+{$else HASGETHEAPSTATUS}
         startmem:=memavail;
         startmem:=memavail;
+{$endif HASGETHEAPSTATUS}
       end;
       end;
 
 
 
 
     procedure tmemdebug.stop;
     procedure tmemdebug.stop;
+{$ifdef HASGETHEAPSTATUS}
+      var
+        status : THeapStatus;
+{$endif HASGETHEAPSTATUS}
       begin
       begin
+{$ifdef HASGETHEAPSTATUS}
+        if startmem<>0 then
+         begin
+           GetHeapStatus(status);
+           inc(TotalMem,startmem-status.CurrHeapUsed);
+           startmem:=0;
+         end;
+{$else HASGETHEAPSTATUS}
         if startmem<>0 then
         if startmem<>0 then
          begin
          begin
            inc(TotalMem,memavail-startmem);
            inc(TotalMem,memavail-startmem);
            startmem:=0;
            startmem:=0;
          end;
          end;
+{$endif HASGETHEAPSTATUS}
       end;
       end;
 
 
 
 
@@ -2345,7 +2367,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.39  2004-11-15 23:35:30  peter
+  Revision 1.40  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.39  2004/11/15 23:35:30  peter
     * tparaitem removed, use tparavarsym instead
     * tparaitem removed, use tparavarsym instead
     * parameter order is now calculated from paranr value in tparavarsym
     * parameter order is now calculated from paranr value in tparavarsym
 
 

+ 20 - 9
compiler/comphook.pas

@@ -203,19 +203,27 @@ end;
 
 
 
 
 function def_status:boolean;
 function def_status:boolean;
+{$ifdef HASGETHEAPSTATUS}
+var
+  hstatus : THeapStatus;
+{$endif HASGETHEAPSTATUS}
 begin
 begin
   def_status:=false; { never stop }
   def_status:=false; { never stop }
 { Status info?, Called every line }
 { Status info?, Called every line }
   if ((status.verbosity and V_Status)<>0) then
   if ((status.verbosity and V_Status)<>0) then
    begin
    begin
-     if (status.compiledlines=1) then
-       WriteLn(memavail shr 10,' Kb Free');
-     if (status.currentline>0) and (status.currentline mod 100=0) then
-{$ifdef FPC}
-       WriteLn(status.currentline,' ',DStr(memavail shr 10),'/',DStr(system.heapsize shr 10),' Kb Free');
-{$else}
-       WriteLn(status.currentline,' ',DStr(memavail shr 10),' Kb Free');
-{$endif}
+     if (status.compiledlines=1) or
+        (status.currentline mod 100=0) then
+       begin
+         if status.currentline>0 then
+	   Write(status.currentline,' ');
+{$ifdef HASGETHEAPSTATUS}
+         GetHeapStatus(hstatus);
+         WriteLn(DStr(hstatus.CurrHeapUsed shr 10),'/',DStr(hstatus.CurrHeapSize shr 10),' Kb Used');
+{$else HASGETHEAPSTATUS}
+         WriteLn(DStr(memavail shr 10),'/',DStr(system.heapsize shr 10),' Kb Free');
+{$endif HASGETHEAPSTATUS}
+       end;
    end
    end
 end;
 end;
 
 
@@ -378,7 +386,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.31  2004-10-15 09:14:16  mazen
+  Revision 1.32  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.31  2004/10/15 09:14:16  mazen
   - remove $IFDEF DELPHI and related code
   - remove $IFDEF DELPHI and related code
   - remove $IFDEF FPCPROCVAR and related code
   - remove $IFDEF FPCPROCVAR and related code
 
 

+ 13 - 2
compiler/compiler.pas

@@ -375,6 +375,9 @@ var
 {$ifdef USEEXCEPT}
 {$ifdef USEEXCEPT}
   recoverpos : jmp_buf;
   recoverpos : jmp_buf;
 {$endif}
 {$endif}
+{$ifdef HASGETHEAPSTATUS}
+  hstatus : THeapStatus;
+{$endif HASGETHEAPSTATUS}
 begin
 begin
   olddo_stop:=do_stop;
   olddo_stop:=do_stop;
   do_stop:=@minimal_stop;
   do_stop:=@minimal_stop;
@@ -430,7 +433,12 @@ begin
 
 
   DoneVerbose;
   DoneVerbose;
 {$ifdef SHOWUSEDMEM}
 {$ifdef SHOWUSEDMEM}
-  Writeln('Memory used (heapsize): ',DStr(system.Heapsize shr 10),' Kb');
+  {$ifdef HASGETHEAPSTATUS}
+    GetHeapStatus(hstatus);
+    Writeln('Max Memory used/heapsize: ',DStr(hstatus.MaxHeapUsed shr 10),'/',DStr(hstatus.MaxHeapSize shr 10),' Kb');
+  {$else HASGETHEAPSTATUS}
+    Writeln('Memory used (heapsize): ',DStr(system.Heapsize shr 10),' Kb');
+  {$endif HASGETHEAPSTATUS}
 {$endif SHOWUSEDMEM}
 {$endif SHOWUSEDMEM}
 {$ifdef fixLeaksOnError}
 {$ifdef fixLeaksOnError}
   do_stop;
   do_stop;
@@ -440,7 +448,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.49  2004-10-15 09:14:16  mazen
+  Revision 1.50  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.49  2004/10/15 09:14:16  mazen
   - remove $IFDEF DELPHI and related code
   - remove $IFDEF DELPHI and related code
   - remove $IFDEF FPCPROCVAR and related code
   - remove $IFDEF FPCPROCVAR and related code
 
 

+ 5 - 1
compiler/options.pas

@@ -1750,6 +1750,7 @@ begin
   def_symbol('STR_USES_VALINT');
   def_symbol('STR_USES_VALINT');
   def_symbol('NOSAVEREGISTERS');
   def_symbol('NOSAVEREGISTERS');
   def_symbol('SHORTSTRCOMPAREINREG');
   def_symbol('SHORTSTRCOMPAREINREG');
+  def_symbol('HASGETHEAPSTATUS');
 
 
 { using a case is pretty useless here (FK) }
 { using a case is pretty useless here (FK) }
 { some stuff for TP compatibility }
 { some stuff for TP compatibility }
@@ -2090,7 +2091,10 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.153  2004-11-17 22:21:35  peter
+  Revision 1.154  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.153  2004/11/17 22:21:35  peter
   mangledname setting moved to place after the complete proc declaration is read
   mangledname setting moved to place after the complete proc declaration is read
   import generation moved to place where body is also parsed (still gives problems with win32)
   import generation moved to place where body is also parsed (still gives problems with win32)
 
 

+ 13 - 1
ide/fpcompil.pas

@@ -509,6 +509,9 @@ end;
 procedure TCompilerStatusDialog.Update;
 procedure TCompilerStatusDialog.Update;
 var
 var
   StatusS,KeyS: string;
   StatusS,KeyS: string;
+{$ifdef HASGETHEAPSTATUS}  
+  hstatus : THeapStatus;
+{$endif HASGETHEAPSTATUS}  
 const
 const
   MaxFileNameSize = 46;
   MaxFileNameSize = 46;
 begin
 begin
@@ -567,8 +570,14 @@ begin
   AddFormatParamStr(KillTilde(TargetSwitches^.ItemName(TargetSwitches^.GetCurrSel)));
   AddFormatParamStr(KillTilde(TargetSwitches^.ItemName(TargetSwitches^.GetCurrSel)));
   AddFormatParamInt(Status.CurrentLine);
   AddFormatParamInt(Status.CurrentLine);
   AddFormatParamInt(Status.CompiledLines);
   AddFormatParamInt(Status.CompiledLines);
+{$ifdef HASGETHEAPSTATUS}  
+  GetHeapStatus(hstatus);
+  AddFormatParamInt(hstatus.CurrHeapUsed div 1024);
+  AddFormatParamInt(hstatus.CurrHeapSize div 1024);
+{$else}
   AddFormatParamInt((Heapsize-MemAvail) div 1024);
   AddFormatParamInt((Heapsize-MemAvail) div 1024);
   AddFormatParamInt(Heapsize div 1024);
   AddFormatParamInt(Heapsize div 1024);
+{$endif}  
   AddFormatParamInt(Status.ErrorCount);
   AddFormatParamInt(Status.ErrorCount);
   ST^.SetText(
   ST^.SetText(
    FormatStrF(
    FormatStrF(
@@ -1256,7 +1265,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.32  2004-11-20 14:21:19  florian
+  Revision 1.33  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.32  2004/11/20 14:21:19  florian
     * implemented reload menu item
     * implemented reload menu item
     * increased file history to 9 files
     * increased file history to 9 files
 
 

+ 7 - 18
rtl/inc/cmem.pp

@@ -150,22 +150,10 @@ begin
   CMemSize:=pptrint(p-sizeof(ptrint))^;
   CMemSize:=pptrint(p-sizeof(ptrint))^;
 end;
 end;
 
 
-Function CMemAvail : ptrint;
+Procedure CGetHeapStatus(var status:THeapStatus);
 
 
 begin
 begin
-  CMemAvail:=0;
-end;
-
-Function CMaxAvail: ptrint;
-
-begin
-  CMaxAvail:=0;
-end;
-
-Function CHeapSize : ptrint;
-
-begin
-  CHeapSize:=0;
+  fillchar(status,sizeof(status),0);
 end;
 end;
 
 
 
 
@@ -179,9 +167,7 @@ Const
       AllocMem : @CAllocMem;
       AllocMem : @CAllocMem;
       ReallocMem : @CReAllocMem;
       ReallocMem : @CReAllocMem;
       MemSize : @CMemSize;
       MemSize : @CMemSize;
-      MemAvail : @CMemAvail;
-      MaxAvail : @CMaxAvail;
-      HeapSize : @CHeapSize;
+      GetHeapStatus : @CGetHeapStatus;
     );
     );
 
 
 Var
 Var
@@ -197,7 +183,10 @@ end.
 
 
 {
 {
  $Log$
  $Log$
- Revision 1.10  2004-11-21 21:14:14  peter
+ Revision 1.11  2004-11-22 19:34:58  peter
+   * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+ Revision 1.10  2004/11/21 21:14:14  peter
    * Freemem(p,0) does nothing
    * Freemem(p,0) does nothing
 
 
  Revision 1.9  2004/09/19 19:04:11  olle
  Revision 1.9  2004/09/19 19:04:11  olle

+ 42 - 103
rtl/inc/heap.inc

@@ -70,9 +70,7 @@ const
     AllocMem: @SysAllocMem;
     AllocMem: @SysAllocMem;
     ReAllocMem: @SysReAllocMem;
     ReAllocMem: @SysReAllocMem;
     MemSize: @SysMemSize;
     MemSize: @SysMemSize;
-    MemAvail: @SysMemAvail;
-    MaxAvail: @SysMaxAvail;
-    HeapSize: @SysHeapSize;
+    GetHeapStatus: @GetHeapStatus;
   );
   );
 
 
   MemoryMutexManager: TMemoryMutexManager = (
   MemoryMutexManager: TMemoryMutexManager = (
@@ -130,8 +128,8 @@ type
   pfreelists   = ^tfreelists;
   pfreelists   = ^tfreelists;
 
 
 var
 var
-  internal_memavail  : ptrint;
-  internal_heapsize  : ptrint;
+  internal_status : THeapStatus;
+
   freelists_fixed    : tfreelists;
   freelists_fixed    : tfreelists;
   freelist_var       : pmemchunk_var;
   freelist_var       : pmemchunk_var;
   freeoslist         : poschunk;
   freeoslist         : poschunk;
@@ -254,62 +252,27 @@ begin
    end;
    end;
 end;
 end;
 
 
+
 procedure FreeMemory(p:pointer;Size:ptrint);
 procedure FreeMemory(p:pointer;Size:ptrint);
 begin
 begin
   FreeMem(p,size);
   FreeMem(p,size);
 end;
 end;
 
 
-function MaxAvail:ptrint;
-begin
-  if IsMultiThread and MemoryManager.NeedLock then
-   begin
-     try
-       MemoryMutexManager.MutexLock;
-       MaxAvail := MemoryManager.MaxAvail();
-     finally
-       MemoryMutexManager.MutexUnlock;
-     end;
-   end
-  else
-   begin
-     MaxAvail := MemoryManager.MaxAvail();
-   end;
-end;
-
-
-function MemAvail:ptrint;
-begin
-  if IsMultiThread and MemoryManager.NeedLock then
-   begin
-     try
-       MemoryMutexManager.MutexLock;
-       MemAvail := MemoryManager.MemAvail();
-     finally
-       MemoryMutexManager.MutexUnlock;
-     end;
-   end
-  else
-   begin
-     MemAvail := MemoryManager.MemAvail();
-   end;
-end;
-
 
 
-{ FPC Additions }
-function HeapSize:ptrint;
+procedure GetHeapStatus(var status:THeapStatus);
 begin
 begin
   if IsMultiThread and MemoryManager.NeedLock then
   if IsMultiThread and MemoryManager.NeedLock then
    begin
    begin
      try
      try
        MemoryMutexManager.MutexLock;
        MemoryMutexManager.MutexLock;
-       HeapSize := MemoryManager.HeapSize();
+       MemoryManager.GetHeapStatus(status);
      finally
      finally
        MemoryMutexManager.MutexUnlock;
        MemoryMutexManager.MutexUnlock;
      end;
      end;
    end
    end
   else
   else
    begin
    begin
-     HeapSize := MemoryManager.HeapSize();
+     MemoryManager.GetHeapStatus(status);
    end;
    end;
 end;
 end;
 
 
@@ -483,47 +446,34 @@ end;
 {$endif ValueFreemem}
 {$endif ValueFreemem}
 
 
 
 
-{*****************************************************************************
-                         Heapsize,Memavail,MaxAvail
-*****************************************************************************}
-
-function SysHeapsize : ptrint;
+{ Bootstrapping }
+{$ifndef HASGETHEAPSTATUS}
+Function  Memavail:ptrint;
 begin
 begin
-  Sysheapsize := internal_heapsize;
-end;
-
-
-function SysMemavail : ptrint;
+  result:=0;
+end;  
+Function  Maxavail:ptrint;
 begin
 begin
-  Sysmemavail := internal_memavail;
-end;
+  result:=0;
+end;  
+Function  Heapsize:ptrint;
+begin
+  result:=0;
+end;  
+{$endif HASGETHEAPSTATUS}
 
 
+{*****************************************************************************
+                               GetHeapStatus
+*****************************************************************************}
 
 
-function SysMaxavail: ptrint;
-var
-  pmc : pmemchunk_var;
-  i: longint;
+procedure SysGetHeapStatus(var status:THeapStatus);
 begin
 begin
-  pmc := freelist_var;
-  sysmaxavail := 0;
-  while assigned(pmc) do
-    begin
-      if pmc^.size>sysmaxavail then
-        sysmaxavail := pmc^.size;
-      pmc := pmc^.next_var;
-    end;
-  if sysmaxavail = 0 then
-    begin
-      for i := maxblockindex downto 1 do
-        if assigned(freelists_fixed[i]) then
-          begin
-            sysmaxavail := i shl blockshr;
-            exit;
-          end;
-    end;
+  internal_status.CurrHeapFree:=internal_status.CurrHeapSize-internal_status.CurrHeapUsed;
+  status:=internal_status;
 end;
 end;
 
 
 
 
+
 {$ifdef DUMPBLOCKS}   // TODO
 {$ifdef DUMPBLOCKS}   // TODO
 procedure DumpBlocks;
 procedure DumpBlocks;
 var
 var
@@ -626,8 +576,7 @@ begin
 {$ifdef HAS_SYSOSFREE}
 {$ifdef HAS_SYSOSFREE}
   if freeoslistcount >= 3 then
   if freeoslistcount >= 3 then
     begin
     begin
-      dec(internal_heapsize, poc^.size);
-      dec(internal_memavail, poc^.size);
+      dec(internal_status.currheapsize, poc^.size);
       SysOSFree(poc, poc^.size);
       SysOSFree(poc, poc^.size);
     end
     end
   else
   else
@@ -841,8 +790,9 @@ begin
         end;
         end;
     end;
     end;
     { set the total new heap size }
     { set the total new heap size }
-    inc(internal_memavail,size);
-    inc(internal_heapsize,size);
+    inc(internal_status.currheapsize,size);
+    if internal_status.currheapsize>internal_status.maxheapsize then
+      internal_status.maxheapsize:=internal_status.currheapsize;
   end;
   end;
   { initialize os-block }
   { initialize os-block }
   poschunk(result)^.used := 0;
   poschunk(result)^.used := 0;
@@ -1008,7 +958,9 @@ begin
       size := (size+sizeof(tmemchunk_var_hdr)+(blocksize-1)) and sizemask;
       size := (size+sizeof(tmemchunk_var_hdr)+(blocksize-1)) and sizemask;
       sysgetmem := sysgetmem_var(size);
       sysgetmem := sysgetmem_var(size);
     end;
     end;
-  dec(internal_memavail,size);
+  inc(internal_status.currheapused,size);
+  if internal_status.currheapused>internal_status.maxheapused then
+    internal_status.maxheapused:=internal_status.currheapused;
 end;
 end;
 
 
 
 
@@ -1025,7 +977,7 @@ begin
   pcurrsize := pcurr^.size and fixedsizemask;
   pcurrsize := pcurr^.size and fixedsizemask;
   if size<>pcurrsize then
   if size<>pcurrsize then
    HandleError(204);
    HandleError(204);
-  inc(internal_memavail,pcurrsize);
+  dec(internal_status.currheapused,pcurrsize);
   { insert the block in it's freelist }
   { insert the block in it's freelist }
   pcurr^.size := pcurr^.size and (not usedflag);
   pcurr^.size := pcurr^.size and (not usedflag);
   blockindex := pcurrsize shr blockshr;
   blockindex := pcurrsize shr blockshr;
@@ -1054,7 +1006,7 @@ begin
   pcurrsize := pcurr^.size and sizemask;
   pcurrsize := pcurr^.size and sizemask;
   if size<>pcurrsize then
   if size<>pcurrsize then
     HandleError(204);
     HandleError(204);
-  inc(internal_memavail,pcurrsize);
+  inc(internal_status.currheapused,pcurrsize);
   { insert the block in it's freelist }
   { insert the block in it's freelist }
   pcurr^.size := pcurr^.size and (not usedflag);
   pcurr^.size := pcurr^.size and (not usedflag);
   append_to_list_var(pcurr);
   append_to_list_var(pcurr);
@@ -1226,7 +1178,7 @@ begin
     split_block(pcurr, size);
     split_block(pcurr, size);
     SysTryResizeMem := true;
     SysTryResizeMem := true;
    end;
    end;
-  dec(internal_memavail,size-oldsize);
+  inc(internal_status.currheapused,size-oldsize);
 {$ifdef TestFreeLists}
 {$ifdef TestFreeLists}
   if test_each then
   if test_each then
     TestFreeLists;
     TestFreeLists;
@@ -1273,21 +1225,6 @@ begin
 end;
 end;
 
 
 
 
-{*****************************************************************************
-                                Mark/Release
-*****************************************************************************}
-
-procedure release(var p : pointer);
-begin
-end;
-
-
-procedure mark(var p : pointer);
-begin
-end;
-
-
-
 {*****************************************************************************
 {*****************************************************************************
                        MemoryMutexManager default hooks
                        MemoryMutexManager default hooks
 *****************************************************************************}
 *****************************************************************************}
@@ -1329,13 +1266,15 @@ begin
   freelist_var := nil;
   freelist_var := nil;
   freeoslist := nil;
   freeoslist := nil;
   freeoslistcount := 0;
   freeoslistcount := 0;
-  internal_heapsize := 0;
-  internal_memavail := 0;
+  fillchar(internal_status,sizeof(internal_status),0);
 end;
 end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.37  2004-10-25 15:38:59  peter
+  Revision 1.38  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.37  2004/10/25 15:38:59  peter
     * compiler defined HEAP and HEAPSIZE removed
     * compiler defined HEAP and HEAPSIZE removed
 
 
   Revision 1.36  2004/08/10 18:58:36  jonas
   Revision 1.36  2004/08/10 18:58:36  jonas

+ 21 - 14
rtl/inc/heaph.inc

@@ -16,6 +16,13 @@
 
 
 { Memorymanager }
 { Memorymanager }
 type
 type
+  THeapStatus = record
+    MaxHeapSize,
+    MaxHeapUsed,
+    CurrHeapSize,
+    CurrHeapUsed,
+    CurrHeapFree  : ptrint;
+  end;
   PMemoryManager = ^TMemoryManager;
   PMemoryManager = ^TMemoryManager;
   TMemoryManager = record
   TMemoryManager = record
     NeedLock    : boolean;
     NeedLock    : boolean;
@@ -25,9 +32,7 @@ type
     AllocMem    : Function(Size:ptrint):Pointer;
     AllocMem    : Function(Size:ptrint):Pointer;
     ReAllocMem  : Function(var p:pointer;Size:ptrint):Pointer;
     ReAllocMem  : Function(var p:pointer;Size:ptrint):Pointer;
     MemSize     : function(p:pointer):ptrint;
     MemSize     : function(p:pointer):ptrint;
-    MemAvail    : Function:ptrint;
-    MaxAvail    : Function:ptrint;
-    HeapSize    : Function:ptrint;
+    GetHeapStatus : procedure(var status:THeapStatus);
   end;
   end;
   TMemoryMutexManager = record
   TMemoryMutexManager = record
     MutexInit : procedure;
     MutexInit : procedure;
@@ -56,21 +61,16 @@ Function  SysMemSize(p:pointer):ptrint;
 Function  SysAllocMem(size:ptrint):Pointer;
 Function  SysAllocMem(size:ptrint):Pointer;
 function  SysTryResizeMem(var p:pointer;size : ptrint):boolean;
 function  SysTryResizeMem(var p:pointer;size : ptrint):boolean;
 Function  SysReAllocMem(var p:pointer;size:ptrint):Pointer;
 Function  SysReAllocMem(var p:pointer;size:ptrint):Pointer;
-Function  Sysmemavail:ptrint;
-Function  Sysmaxavail:ptrint;
-Function  Sysheapsize:ptrint;
+procedure SysGetHeapStatus(var status:THeapStatus);
 
 
 { Tp7 functions }
 { Tp7 functions }
 Procedure Getmem(Var p:pointer;Size:ptrint);
 Procedure Getmem(Var p:pointer;Size:ptrint);
 Procedure Getmemory(Var p:pointer;Size:ptrint);
 Procedure Getmemory(Var p:pointer;Size:ptrint);
 Procedure Freemem(p:pointer;Size:ptrint);
 Procedure Freemem(p:pointer;Size:ptrint);
 Procedure Freememory(p:pointer;Size:ptrint);
 Procedure Freememory(p:pointer;Size:ptrint);
-Function  memavail:ptrint;
-Function  maxavail:ptrint;
 
 
 { FPC additions }
 { FPC additions }
 Function  MemSize(p:pointer):ptrint;
 Function  MemSize(p:pointer):ptrint;
-Function  heapsize:ptrint;
 
 
 { Delphi functions }
 { Delphi functions }
 function GetMem(size:ptrint):pointer;
 function GetMem(size:ptrint):pointer;
@@ -80,10 +80,7 @@ function Freememory(p:pointer):ptrint;
 function AllocMem(Size:ptrint):pointer;
 function AllocMem(Size:ptrint):pointer;
 function ReAllocMem(var p:pointer;Size:ptrint):pointer;
 function ReAllocMem(var p:pointer;Size:ptrint):pointer;
 function ReAllocMemory(var p:pointer;Size:ptrint):pointer;
 function ReAllocMemory(var p:pointer;Size:ptrint):pointer;
-
-{ Do nothing functions, are only here for tp7 compat }
-Procedure mark(var p : pointer);
-Procedure release(var p : pointer);
+procedure GetHeapStatus(var status:THeapStatus);
 
 
 {$ifndef ValueGetmem}
 {$ifndef ValueGetmem}
 { Needed to solve overloading problem with call from assembler (PFV) }
 { Needed to solve overloading problem with call from assembler (PFV) }
@@ -93,9 +90,19 @@ Procedure AsmGetmem(var p:pointer;size:ptrint);
 Procedure AsmFreemem(var p:pointer);
 Procedure AsmFreemem(var p:pointer);
 {$endif ValueFreemem}
 {$endif ValueFreemem}
 
 
+{ Bootstrapping }
+{$ifndef HASGETHEAPSTATUS}
+Function  Memavail:ptrint;
+Function  Maxavail:ptrint;
+Function  Heapsize:ptrint;
+{$endif HASGETHEAPSTATUS}
+
 {
 {
   $Log$
   $Log$
-  Revision 1.11  2004-06-29 20:50:32  peter
+  Revision 1.12  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.11  2004/06/29 20:50:32  peter
     * readded support for ReturnIfGrowHeapFails
     * readded support for ReturnIfGrowHeapFails
 
 
   Revision 1.10  2004/06/20 09:24:40  peter
   Revision 1.10  2004/06/20 09:24:40  peter

+ 19 - 23
rtl/inc/heaptrc.pp

@@ -852,23 +852,25 @@ procedure dumpheap;
 var
 var
   pp : pheap_mem_info;
   pp : pheap_mem_info;
   i : ptrint;
   i : ptrint;
-  ExpectedMemAvail : ptrint;
+  ExpectedHeapFree : ptrint;
+  status : THeapStatus;
 begin
 begin
   pp:=heap_mem_root;
   pp:=heap_mem_root;
   Writeln(ptext^,'Heap dump by heaptrc unit');
   Writeln(ptext^,'Heap dump by heaptrc unit');
   Writeln(ptext^,getmem_cnt, ' memory blocks allocated : ',getmem_size,'/',getmem8_size);
   Writeln(ptext^,getmem_cnt, ' memory blocks allocated : ',getmem_size,'/',getmem8_size);
   Writeln(ptext^,freemem_cnt,' memory blocks freed     : ',freemem_size,'/',freemem8_size);
   Writeln(ptext^,freemem_cnt,' memory blocks freed     : ',freemem_size,'/',freemem8_size);
   Writeln(ptext^,getmem_cnt-freemem_cnt,' unfreed memory blocks : ',getmem_size-freemem_size);
   Writeln(ptext^,getmem_cnt-freemem_cnt,' unfreed memory blocks : ',getmem_size-freemem_size);
-  Write(ptext^,'True heap size : ',system.HeapSize);
+  SysGetHeapStatus(status);
+  Write(ptext^,'True heap size : ',status.CurrHeapSize);
   if EntryMemUsed > 0 then
   if EntryMemUsed > 0 then
     Writeln(ptext^,' (',EntryMemUsed,' used in System startup)')
     Writeln(ptext^,' (',EntryMemUsed,' used in System startup)')
   else
   else
     Writeln(ptext^);
     Writeln(ptext^);
-  Writeln(ptext^,'True free heap : ',MemAvail);
-  ExpectedMemAvail:=system.HeapSize-(getmem8_size-freemem8_size)-
+  Writeln(ptext^,'True free heap : ',status.CurrHeapFree);
+  ExpectedHeapFree:=status.CurrHeapSize-(getmem8_size-freemem8_size)-
     (getmem_cnt-freemem_cnt)*(sizeof(theap_mem_info)+extra_info_size)-EntryMemUsed;
     (getmem_cnt-freemem_cnt)*(sizeof(theap_mem_info)+extra_info_size)-EntryMemUsed;
-  If ExpectedMemAvail<>MemAvail then
-    Writeln(ptext^,'Should be : ',ExpectedMemAvail);
+  If ExpectedHeapFree<>status.CurrHeapFree then
+    Writeln(ptext^,'Should be : ',ExpectedHeapFree);
   i:=getmem_cnt-freemem_cnt;
   i:=getmem_cnt-freemem_cnt;
   while pp<>nil do
   while pp<>nil do
    begin
    begin
@@ -935,19 +937,9 @@ end;
                             No specific tracing calls
                             No specific tracing calls
 *****************************************************************************}
 *****************************************************************************}
 
 
-function TraceMemAvail:ptrint;
+procedure TraceGetHeapStatus(var status:THeapStatus);
 begin
 begin
-  TraceMemAvail:=SysMemAvail;
-end;
-
-function TraceMaxAvail:ptrint;
-begin
-  TraceMaxAvail:=SysMaxAvail;
-end;
-
-function TraceHeapSize:ptrint;
-begin
-  TraceHeapSize:=SysHeapSize;
+  SysGetHeapStatus(status);
 end;
 end;
 
 
 
 
@@ -999,15 +991,16 @@ const
     AllocMem : @TraceAllocMem;
     AllocMem : @TraceAllocMem;
     ReAllocMem : @TraceReAllocMem;
     ReAllocMem : @TraceReAllocMem;
     MemSize : @TraceMemSize;
     MemSize : @TraceMemSize;
-    MemAvail : @TraceMemAvail;
-    MaxAvail : @TraceMaxAvail;
-    HeapSize : @TraceHeapsize;
+    GetHeapStatus : @TraceGetHeapStatus;
   );
   );
 
 
 
 
 procedure TraceInit;
 procedure TraceInit;
+var
+  initheapstatus : THeapStatus;
 begin
 begin
-  EntryMemUsed:=System.HeapSize-MemAvail;
+  SysGetHeapStatus(initheapstatus);
+  EntryMemUsed:=initheapstatus.CurrHeapUsed;
   MakeCRC32Tbl;
   MakeCRC32Tbl;
   SetMemoryManager(TraceManager);
   SetMemoryManager(TraceManager);
   ptext:=@stderr;
   ptext:=@stderr;
@@ -1151,7 +1144,10 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.36  2004-10-25 17:04:07  peter
+  Revision 1.37  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.36  2004/10/25 17:04:07  peter
     * fix for non-i386
     * fix for non-i386
 
 
   Revision 1.35  2004/10/25 15:38:59  peter
   Revision 1.35  2004/10/25 15:38:59  peter

+ 8 - 19
rtl/inc/objects.pp

@@ -1860,7 +1860,7 @@ END;
 {---------------------------------------------------------------------------}
 {---------------------------------------------------------------------------}
 FUNCTION TMemoryStream.ChangeListSize (ALimit: Longint): Boolean;
 FUNCTION TMemoryStream.ChangeListSize (ALimit: Longint): Boolean;
 VAR
 VAR
-  I, W: Longint;
+  W: Longint;
   Li: LongInt;
   Li: LongInt;
   P: PPointerArray;
   P: PPointerArray;
 BEGIN
 BEGIN
@@ -1869,14 +1869,8 @@ BEGIN
      If (ALimit > MaxPtrs) Then Exit;                 { To many blocks req }
      If (ALimit > MaxPtrs) Then Exit;                 { To many blocks req }
      If (ALimit <> 0) Then Begin                      { Create segment list }
      If (ALimit <> 0) Then Begin                      { Create segment list }
        Li := ALimit * SizeOf(Pointer);                { Block array size }
        Li := ALimit * SizeOf(Pointer);                { Block array size }
-       If (MaxAvail > Li) Then Begin
-         GetMem(P, Li);                               { Allocate memory }
-         FillChar(P^, Li, #0);                        { Clear the memory }
-       End Else Begin
-         GetMem(P,Li);
-         If P = Nil Then Exit;
-         FillChar(P^, Li, #0);                        { Clear the memory }
-       End;                           { Insufficient memory }
+       GetMem(P, Li);                               { Allocate memory }
+       FillChar(P^, Li, #0);                        { Clear the memory }
        If (BlkCount <> 0) AND (BlkList <> Nil) Then   { Current list valid }
        If (BlkCount <> 0) AND (BlkList <> Nil) Then   { Current list valid }
          If (BlkCount <= ALimit) Then Move(BlkList^,
          If (BlkCount <= ALimit) Then Move(BlkList^,
            P^, BlkCount * SizeOf(Pointer)) Else       { Move whole old list }
            P^, BlkCount * SizeOf(Pointer)) Else       { Move whole old list }
@@ -1887,15 +1881,7 @@ BEGIN
          FreeMem(BlkList^[W], BlkSize);               { Release memory block }
          FreeMem(BlkList^[W], BlkSize);               { Release memory block }
      If (P <> Nil) AND (ALimit > BlkCount) Then Begin { Expand stream size }
      If (P <> Nil) AND (ALimit > BlkCount) Then Begin { Expand stream size }
        For W := BlkCount To ALimit-1 Do Begin
        For W := BlkCount To ALimit-1 Do Begin
-         If (MaxAvail < BlkSize) Then Begin           { Check enough memory }
-           GetMem(P^[W],BlkSize);
-           If P = Nil Then Begin
-             For I := BlkCount To W-1 Do
-               FreeMem(P^[I], BlkSize);                 { Free mem allocated }
-             FreeMem(P, Li);                            { Release memory }
-             Exit;
-           End                      { Now exit }
-         End Else GetMem(P^[W], BlkSize);             { Allocate memory }
+         GetMem(P^[W], BlkSize);             { Allocate memory }
        End;
        End;
      End;
      End;
      If (BlkCount <> 0) AND (BlkList<>Nil) Then
      If (BlkCount <> 0) AND (BlkList<>Nil) Then
@@ -3019,7 +3005,10 @@ BEGIN
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.35  2004-11-02 23:53:19  peter
+  Revision 1.36  2004-11-22 19:34:58  peter
+    * GetHeapStatus added, removed MaxAvail,MemAvail,HeapSize
+
+  Revision 1.35  2004/11/02 23:53:19  peter
     * fixed crashes with ide and 1.9.x
     * fixed crashes with ide and 1.9.x
 
 
   Revision 1.34  2004/10/03 17:43:47  florian
   Revision 1.34  2004/10/03 17:43:47  florian