mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-19 15:30:30 +02:00
* memavail fixes
This commit is contained in:
parent
c38daf68eb
commit
bbb08436c5
@ -22,7 +22,6 @@ program test_fail;
|
|||||||
end;
|
end;
|
||||||
var
|
var
|
||||||
ta1, ta2 : tarraycla;
|
ta1, ta2 : tarraycla;
|
||||||
availmem : longint;
|
|
||||||
|
|
||||||
constructor tarraycla.create(do_fail : boolean);
|
constructor tarraycla.create(do_fail : boolean);
|
||||||
begin
|
begin
|
||||||
@ -63,7 +62,6 @@ program test_fail;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
availmem:=memavail;
|
|
||||||
ta1:=tarraycla.create(false);
|
ta1:=tarraycla.create(false);
|
||||||
writeln('Call to ta1.test after successful init');
|
writeln('Call to ta1.test after successful init');
|
||||||
ta1.test;
|
ta1.test;
|
||||||
|
@ -600,11 +600,11 @@ procedure test119;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
startmemavail : longint;
|
hstatusstart,
|
||||||
|
hstatusend : theapstatus;
|
||||||
begin
|
begin
|
||||||
writeln('Testing exception handling');
|
writeln('Testing exception handling');
|
||||||
startmemavail:=memavail;
|
getheapstatus(hstatusstart);
|
||||||
i:=-1;
|
i:=-1;
|
||||||
try
|
try
|
||||||
test1;
|
test1;
|
||||||
@ -769,7 +769,8 @@ begin
|
|||||||
if i<>2 then
|
if i<>2 then
|
||||||
do_error(1119);
|
do_error(1119);
|
||||||
|
|
||||||
if memavail<startmemavail then
|
getheapstatus(hstatusend);
|
||||||
|
if hstatusstart.Currheapused<>hstatusend.Currheapused then
|
||||||
begin
|
begin
|
||||||
writeln('exception generates memory holes');
|
writeln('exception generates memory holes');
|
||||||
do_error(99999);
|
do_error(99999);
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
}
|
}
|
||||||
PROGRAM TestHeap;
|
PROGRAM TestHeap;
|
||||||
|
|
||||||
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
const
|
const
|
||||||
{$ifdef cpusparc}
|
{$ifdef cpusparc}
|
||||||
@ -27,8 +29,10 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
procedure ShowHeap;
|
procedure ShowHeap;
|
||||||
|
var
|
||||||
|
hstatus : THeapstatus;
|
||||||
begin
|
begin
|
||||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail,' Heapsize: ',Heapsize);
|
WriteLn ('Used: ', hstatus.CurrHeapUsed, ' Free: ', hstatus.CurrHeapFree,' Size: ',hstatus.CurrHeapSize);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -143,21 +147,6 @@ BEGIN
|
|||||||
Inc (TotalTime, Delta);
|
Inc (TotalTime, Delta);
|
||||||
WriteLn (Delta:5, ' ms');
|
WriteLn (Delta:5, ' ms');
|
||||||
ShowHeap;
|
ShowHeap;
|
||||||
Start := MSTimer;
|
|
||||||
FOR L := 1 TO Blocks DO BEGIN
|
|
||||||
MaxAvail;
|
|
||||||
END;
|
|
||||||
Delta := MSTimer-Start;
|
|
||||||
Inc (TotalTime, (Delta + 5) DIV 10);
|
|
||||||
WriteLn (Blocks,' calls to MaxAvail: ', Delta:5, ' ms');
|
|
||||||
Start := MSTimer;
|
|
||||||
FOR L := 1 TO Blocks DO BEGIN
|
|
||||||
MemAvail;
|
|
||||||
END;
|
|
||||||
Delta := MSTimer - Start;
|
|
||||||
Inc (TotalTime, (Delta + 5) DIV 10);
|
|
||||||
WriteLn (Blocks,' calls to MemAvail: ', Delta:5, ' ms');
|
|
||||||
ShowHeap;
|
|
||||||
Write ('Reallocating deallocated ',(Blocks div 2 + 1),' blocks at random: ');
|
Write ('Reallocating deallocated ',(Blocks div 2 + 1),' blocks at random: ');
|
||||||
Start := MSTimer;
|
Start := MSTimer;
|
||||||
FOR L := (Blocks div 2+1) TO Blocks DO BEGIN
|
FOR L := (Blocks div 2+1) TO Blocks DO BEGIN
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
program test_fail;
|
program test_fail;
|
||||||
|
|
||||||
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
type
|
type
|
||||||
parrayobj = ^tarrayobj;
|
parrayobj = ^tarrayobj;
|
||||||
tarrayobj = object
|
tarrayobj = object
|
||||||
@ -64,20 +67,24 @@ program test_fail;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
availmem:=memavail;
|
|
||||||
new(pa1,init(false));
|
new(pa1,init(false));
|
||||||
writeln('After successful new(pa1,init), memory used = ',availmem - memavail);
|
getheapstatus(hstatus);
|
||||||
|
writeln('After successful new(pa1,init), memory used = ',hstatus.CurrHeapUsed);
|
||||||
new(pa2,init(true));
|
new(pa2,init(true));
|
||||||
writeln('After unsuccessful new(pa2,init), memory used = ',availmem - memavail);
|
getheapstatus(hstatus);
|
||||||
|
writeln('After unsuccessful new(pa2,init), memory used = ',hstatus.CurrHeapUsed);
|
||||||
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
||||||
writeln('Call to pa1^.test after successful init');
|
writeln('Call to pa1^.test after successful init');
|
||||||
pa1^.test;
|
pa1^.test;
|
||||||
dispose(pa1,done);
|
dispose(pa1,done);
|
||||||
writeln('After release of pa1, memory used = ',availmem - memavail);
|
getheapstatus(hstatus);
|
||||||
|
writeln('After release of pa1, memory used = ',hstatus.CurrHeapUsed);
|
||||||
pa1:=new(pbigarrayobj,good_init);
|
pa1:=new(pbigarrayobj,good_init);
|
||||||
writeln('After successful pa1:=new(pbigarrayobj,good_init), memory used = ',availmem - memavail);
|
getheapstatus(hstatus);
|
||||||
|
writeln('After successful pa1:=new(pbigarrayobj,good_init), memory used = ',hstatus.CurrHeapUsed);
|
||||||
pa2:=new(pbigarrayobj,wrong_init);
|
pa2:=new(pbigarrayobj,wrong_init);
|
||||||
writeln('After unsuccessful pa2:=new(pbigarrayobj,wrong_init), memory used = ',availmem - memavail);
|
getheapstatus(hstatus);
|
||||||
|
writeln('After unsuccessful pa2:=new(pbigarrayobj,wrong_init), memory used = ',hstatus.CurrHeapUsed);
|
||||||
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
||||||
writeln('Call to pa1^.test after successful init');
|
writeln('Call to pa1^.test after successful init');
|
||||||
pa1^.test;
|
pa1^.test;
|
||||||
|
@ -94,10 +94,7 @@ var
|
|||||||
obj: pbase;
|
obj: pbase;
|
||||||
devobj: tderived;
|
devobj: tderived;
|
||||||
Begin
|
Begin
|
||||||
WriteLn(MemAvail);
|
|
||||||
obj:=new(pbase,init(10));
|
obj:=new(pbase,init(10));
|
||||||
obj^.showit;
|
obj^.showit;
|
||||||
WriteLn(MemAvail);
|
|
||||||
dispose(obj,done);
|
dispose(obj,done);
|
||||||
WriteLn(MemAvail);
|
|
||||||
end.
|
end.
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
Program ansitest;
|
Program ansitest;
|
||||||
|
|
||||||
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
{$ifdef cpu68k}
|
{$ifdef cpu68k}
|
||||||
{$define COMP_IS_INT64}
|
{$define COMP_IS_INT64}
|
||||||
{$endif cpu68k}
|
{$endif cpu68k}
|
||||||
@ -10,33 +13,11 @@ Program ansitest;
|
|||||||
{$define COMP_IS_INT64}
|
{$define COMP_IS_INT64}
|
||||||
{$endif FPC_COMP_IS_INT64}
|
{$endif FPC_COMP_IS_INT64}
|
||||||
|
|
||||||
{$ifdef ver1_0}
|
|
||||||
type
|
|
||||||
ptrint=longint;
|
|
||||||
sizeint=longint;
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
{$ifndef fpc}
|
|
||||||
type
|
|
||||||
ptrint=longint;
|
|
||||||
sizeint=longint;
|
|
||||||
Function Memavail : ptrint;
|
|
||||||
begin
|
|
||||||
Result:=0;
|
|
||||||
end;
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
{ -------------------------------------------------------------------
|
{ -------------------------------------------------------------------
|
||||||
General stuff
|
General stuff
|
||||||
------------------------------------------------------------------- }
|
------------------------------------------------------------------- }
|
||||||
|
|
||||||
Procedure DoMem (Var StartMem : sizeint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Writeln ('Lost ',StartMem-Memavail,' Bytes.');
|
|
||||||
StartMem:=MemAvail;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Procedure DoRef (P : Pointer);
|
Procedure DoRef (P : Pointer);
|
||||||
|
|
||||||
Type Psizeint = ^sizeint;
|
Type Psizeint = ^sizeint;
|
||||||
@ -142,7 +123,8 @@ Var S : AnsiString;
|
|||||||
Mem : sizeint;
|
Mem : sizeint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Mem:=MemAvail;
|
Mem:=0;
|
||||||
|
DoMem(Mem);
|
||||||
S :='This is another ansistring';
|
S :='This is another ansistring';
|
||||||
Writeln ('Calling testvalparam with "',s,'"');
|
Writeln ('Calling testvalparam with "',s,'"');
|
||||||
testvalparam (s);
|
testvalparam (s);
|
||||||
@ -338,7 +320,8 @@ Var I : Integer;
|
|||||||
mem : sizeint;
|
mem : sizeint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
mem:=memavail;
|
mem:=0;
|
||||||
|
DoMem(mem);
|
||||||
S3 := 'ABCDEF';
|
S3 := 'ABCDEF';
|
||||||
Write ('S1+S2=S3 :');
|
Write ('S1+S2=S3 :');
|
||||||
If S1+S2=S3 then writeln (ok) else writeln (nok);
|
If S1+S2=S3 then writeln (ok) else writeln (nok);
|
||||||
@ -381,7 +364,8 @@ Var S,T : AnsiString;
|
|||||||
Co : Comp;
|
Co : Comp;
|
||||||
TempMem:sizeint;
|
TempMem:sizeint;
|
||||||
begin
|
begin
|
||||||
TempMem:=Memavail;
|
TempMem:=0;
|
||||||
|
DoMem(TempMem);
|
||||||
S:='ABCDEF';
|
S:='ABCDEF';
|
||||||
Write ('S = "',S,'"');Doref(Pointer(S));
|
Write ('S = "',S,'"');Doref(Pointer(S));
|
||||||
T:=Copy(S,1,3);
|
T:=Copy(S,1,3);
|
||||||
@ -468,8 +452,10 @@ end;
|
|||||||
Var GlobalStartMem,StartMem : PtrInt;
|
Var GlobalStartMem,StartMem : PtrInt;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
GlobalStartMem:=MemAvail;
|
GlobalStartMem:=0;
|
||||||
StartMem:=MemAvail;
|
StartMem:=0;
|
||||||
|
DoMem(GlobalStartMem);
|
||||||
|
DoMem(StartMem);
|
||||||
Writeln ('Testing Initialize/Finalize.');
|
Writeln ('Testing Initialize/Finalize.');
|
||||||
TestInitFinal;
|
TestInitFinal;
|
||||||
Write ('End of Initialize/finalize test : ');DoMem(StartMem);
|
Write ('End of Initialize/finalize test : ');DoMem(StartMem);
|
||||||
|
@ -1,25 +1,13 @@
|
|||||||
{ %VERSION=1.1 }
|
{ %VERSION=1.1 }
|
||||||
Program widetest;
|
Program widetest;
|
||||||
|
|
||||||
Function MemUsed : Longint;
|
uses
|
||||||
begin
|
erroru;
|
||||||
{$ifdef fpc}
|
|
||||||
MemUsed:=Heapsize-Memavail;
|
|
||||||
{$else}
|
|
||||||
MemUsed:=0;
|
|
||||||
{$endif}
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ -------------------------------------------------------------------
|
{ -------------------------------------------------------------------
|
||||||
General stuff
|
General stuff
|
||||||
------------------------------------------------------------------- }
|
------------------------------------------------------------------- }
|
||||||
|
|
||||||
Procedure DoMem (Var StartMem : Longint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Writeln ('Lost ',StartMem-MemUsed,' Bytes.');
|
|
||||||
StartMem:=MemUsed;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Procedure DoRef (P : Pointer);
|
Procedure DoRef (P : Pointer);
|
||||||
|
|
||||||
@ -132,7 +120,8 @@ Var S : WideString;
|
|||||||
Mem : Longint;
|
Mem : Longint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Mem:=MemUsed;
|
Mem:=0;
|
||||||
|
DoMem(Mem);
|
||||||
S :='This is another WideString';
|
S :='This is another WideString';
|
||||||
Writeln ('Calling testvalparam with "',s,'"');
|
Writeln ('Calling testvalparam with "',s,'"');
|
||||||
testvalparam (s);
|
testvalparam (s);
|
||||||
@ -329,7 +318,8 @@ Var I : Integer;
|
|||||||
mem : Longint;
|
mem : Longint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
mem:=MemUsed;
|
mem:=0;
|
||||||
|
DoMem(Mem);
|
||||||
S3 := 'ABCDEF';
|
S3 := 'ABCDEF';
|
||||||
Write ('S1+S2=S3 :');
|
Write ('S1+S2=S3 :');
|
||||||
If S1+S2=S3 then writeln (ok) else writeln (nok);
|
If S1+S2=S3 then writeln (ok) else writeln (nok);
|
||||||
@ -372,7 +362,8 @@ Var S,T : WideString;
|
|||||||
Co : Comp;
|
Co : Comp;
|
||||||
TempMem:Longint;
|
TempMem:Longint;
|
||||||
begin
|
begin
|
||||||
TempMem:=MemUsed;
|
TempMem:=0;
|
||||||
|
DoMem(TempMem);
|
||||||
S:='ABCDEF';
|
S:='ABCDEF';
|
||||||
Write ('S = "',S,'"');Doref(Pointer(S));
|
Write ('S = "',S,'"');Doref(Pointer(S));
|
||||||
T:=Copy(S,1,3);
|
T:=Copy(S,1,3);
|
||||||
@ -459,8 +450,10 @@ end;
|
|||||||
Var GlobalStartMem,StartMem : Longint;
|
Var GlobalStartMem,StartMem : Longint;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
GlobalStartMem:=MemUsed;
|
GlobalStartMem:=0;
|
||||||
StartMem:=MemUsed;
|
StartMem:=0;
|
||||||
|
DoMem(GlobalStartMem);
|
||||||
|
DoMem(StartMem);
|
||||||
Writeln ('Testing Initialize/Finalize.');
|
Writeln ('Testing Initialize/Finalize.');
|
||||||
TestInitFinal;
|
TestInitFinal;
|
||||||
Write ('End of Initialize/finalize test : ');DoMem(StartMem);
|
Write ('End of Initialize/finalize test : ');DoMem(StartMem);
|
||||||
|
@ -2,6 +2,13 @@
|
|||||||
unit erroru;
|
unit erroru;
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
{$ifdef ver1_0}
|
||||||
|
type
|
||||||
|
ptrint=longint;
|
||||||
|
sizeint=longint;
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
procedure do_error(l : longint);
|
procedure do_error(l : longint);
|
||||||
|
|
||||||
procedure error;
|
procedure error;
|
||||||
@ -10,6 +17,21 @@ interface
|
|||||||
|
|
||||||
procedure require_error(num : longint);
|
procedure require_error(num : longint);
|
||||||
|
|
||||||
|
{$ifndef HASGETHEAPSTATUS}
|
||||||
|
type
|
||||||
|
THeapStatus = record
|
||||||
|
MaxHeapSize,
|
||||||
|
MaxHeapUsed,
|
||||||
|
CurrHeapSize,
|
||||||
|
CurrHeapUsed,
|
||||||
|
CurrHeapFree : ptrint;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure getheapstatus(var status:THeapStatus);
|
||||||
|
{$endif HASGETHEAPSTATUS}
|
||||||
|
|
||||||
|
Procedure DoMem (Var StartMem : sizeint);
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -80,6 +102,29 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$ifndef HASGETHEAPSTATUS}
|
||||||
|
procedure getheapstatus(var status:THeapStatus);
|
||||||
|
begin
|
||||||
|
fillchar(status,sizeof(status),0);
|
||||||
|
status.MaxHeapSize:=HeapSize;
|
||||||
|
status.MaxHeapUsed:=HeapSize-MemAvail;
|
||||||
|
status.CurrHeapSize:=HeapSize;
|
||||||
|
status.CurrHeapUsed:=HeapSize-MemAvail;
|
||||||
|
status.CurrHeapFree:=MemAvail;
|
||||||
|
end;
|
||||||
|
{$endif HASGETHEAPSTATUS}
|
||||||
|
|
||||||
|
|
||||||
|
Procedure DoMem (Var StartMem : sizeint);
|
||||||
|
var
|
||||||
|
hstatus : THeapstatus;
|
||||||
|
begin
|
||||||
|
GetHeapStatus(hstatus);
|
||||||
|
if StartMem<>0 then
|
||||||
|
Writeln ('Used: ',hstatus.CUrrHeapUsed shr 10,'Kb, Lost ',hstatus.CurrHeapUsed-StartMem,' Bytes.');
|
||||||
|
StartMem:=hstatus.CurrHeapUsed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
finalization
|
finalization
|
||||||
|
Loading…
Reference in New Issue
Block a user