mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 13:19:12 +02:00
+ memorymanager like delphi
This commit is contained in:
parent
b9c5aa653c
commit
2a14ecc703
@ -24,12 +24,21 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ Memory manager }
|
||||||
|
const
|
||||||
|
MemoryManager: TMemoryManager = (
|
||||||
|
GetMem: SysGetMem;
|
||||||
|
FreeMem: SysFreeMem
|
||||||
|
);
|
||||||
|
|
||||||
|
{ Default Heap }
|
||||||
const
|
const
|
||||||
max_size = 256;
|
max_size = 256;
|
||||||
maxblock = max_size div 8;
|
maxblock = max_size div 8;
|
||||||
freerecord_list_length : longint = 0;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
|
ppointer = ^pointer;
|
||||||
|
|
||||||
pfreerecord = ^tfreerecord;
|
pfreerecord = ^tfreerecord;
|
||||||
tfreerecord = record
|
tfreerecord = record
|
||||||
next : pfreerecord;
|
next : pfreerecord;
|
||||||
@ -41,26 +50,23 @@ type
|
|||||||
tnblocks = array[1..maxblock] of longint;
|
tnblocks = array[1..maxblock] of longint;
|
||||||
pnblocks = ^tnblocks;
|
pnblocks = ^tnblocks;
|
||||||
|
|
||||||
|
|
||||||
ppointer = ^pointer;
|
|
||||||
|
|
||||||
|
|
||||||
var
|
var
|
||||||
internal_memavail : longint;
|
internal_memavail : longint;
|
||||||
internal_heapsize : longint;
|
internal_heapsize : longint;
|
||||||
baseblocks : tblocks;
|
baseblocks : tblocks;
|
||||||
basenblocks : tnblocks;
|
basenblocks : tnblocks;
|
||||||
|
|
||||||
|
|
||||||
const
|
const
|
||||||
blocks : pblocks = @baseblocks;
|
blocks : pblocks = @baseblocks;
|
||||||
nblocks : pnblocks = @basenblocks;
|
nblocks : pnblocks = @basenblocks;
|
||||||
|
|
||||||
|
|
||||||
|
{ Check Heap }
|
||||||
{$IfDef CHECKHEAP}
|
{$IfDef CHECKHEAP}
|
||||||
{ 4 levels of tracing }
|
{ 4 levels of tracing }
|
||||||
const
|
const
|
||||||
tracesize = 4;
|
tracesize = 4;
|
||||||
|
freerecord_list_length : longint = 0;
|
||||||
type
|
type
|
||||||
pheap_mem_info = ^heap_mem_info;
|
pheap_mem_info = ^heap_mem_info;
|
||||||
heap_mem_info = record
|
heap_mem_info = record
|
||||||
@ -85,6 +91,7 @@ const
|
|||||||
{$EndIf CHECKHEAP}
|
{$EndIf CHECKHEAP}
|
||||||
|
|
||||||
|
|
||||||
|
{ Temp Heap }
|
||||||
{$ifdef TEMPHEAP}
|
{$ifdef TEMPHEAP}
|
||||||
const
|
const
|
||||||
heap_split : boolean = false;
|
heap_split : boolean = false;
|
||||||
@ -109,6 +116,40 @@ const
|
|||||||
otherheap : pheapinfo;
|
otherheap : pheapinfo;
|
||||||
{$endif TEMPHEAP}
|
{$endif TEMPHEAP}
|
||||||
|
|
||||||
|
{*****************************************************************************
|
||||||
|
Memory Manager
|
||||||
|
*****************************************************************************}
|
||||||
|
|
||||||
|
procedure GetMemoryManager(var MemMgr:TMemoryManager);
|
||||||
|
begin
|
||||||
|
MemMgr:=MemoryManager;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure SetMemoryManager(const MemMgr:TMemoryManager);
|
||||||
|
begin
|
||||||
|
MemoryManager:=MemMgr;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function IsMemoryManagerSet:Boolean;
|
||||||
|
begin
|
||||||
|
IsMemoryManagerSet:=(MemoryManager.GetMem<>@SysGetMem) or
|
||||||
|
(MemoryManager.FreeMem<>@SysFreeMem);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure GetMem(Var p:pointer;Size:Longint);[public,alias:{$ifdef FPCNAMES}'FPC_'+{$endif}'GETMEM'];
|
||||||
|
begin
|
||||||
|
MemoryManager.GetMem(p,Size);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure FreeMem(Var p:pointer;Size:Longint);[public,alias:{$ifdef FPCNAMES}'FPC_'+{$endif}'FREEMEM'];
|
||||||
|
begin
|
||||||
|
MemoryManager.FreeMem(p,Size);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Heapsize,Memavail,MaxAvail
|
Heapsize,Memavail,MaxAvail
|
||||||
@ -149,12 +190,10 @@ var
|
|||||||
begin
|
begin
|
||||||
ma:=heapend-heapptr;
|
ma:=heapend-heapptr;
|
||||||
{ count blocks }
|
{ count blocks }
|
||||||
|
|
||||||
if heapblocks then
|
if heapblocks then
|
||||||
for i:=1 to maxblock do
|
for i:=1 to maxblock do
|
||||||
inc(ma,i*8*nblocks^[i]);
|
inc(ma,i*8*nblocks^[i]);
|
||||||
{ walk freelist }
|
{ walk freelist }
|
||||||
|
|
||||||
hp:=freelist;
|
hp:=freelist;
|
||||||
while assigned(hp) do
|
while assigned(hp) do
|
||||||
begin
|
begin
|
||||||
@ -485,10 +524,10 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
GetMem
|
SysGetMem
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
procedure getmem(var p : pointer;size : longint);[public,alias: {$ifdef FPCNAMES}'FPC_'+{$endif}'GETMEM'];
|
procedure SysGetMem(var p : pointer;size : longint);
|
||||||
type
|
type
|
||||||
heaperrorproc=function(size:longint):integer;
|
heaperrorproc=function(size:longint):integer;
|
||||||
var
|
var
|
||||||
@ -660,10 +699,10 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
FreeMem
|
SysFreeMem
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
procedure freemem(var p : pointer;size : longint);[public,alias: {$ifdef FPCNAMES}'FPC_'+{$endif}'FREEMEM'];
|
procedure SysFreeMem(var p : pointer;size : longint);
|
||||||
var
|
var
|
||||||
hp : pfreerecord;
|
hp : pfreerecord;
|
||||||
{$ifdef TEMPHEAP}
|
{$ifdef TEMPHEAP}
|
||||||
@ -929,11 +968,11 @@ begin
|
|||||||
{ Allocate by 64K size }
|
{ Allocate by 64K size }
|
||||||
size:=(size+$fffff) and $ffff0000;
|
size:=(size+$fffff) and $ffff0000;
|
||||||
{ first try 1Meg }
|
{ first try 1Meg }
|
||||||
if size<$100000 then
|
if size<GrowHeapSize then
|
||||||
begin
|
begin
|
||||||
NewPos:=Sbrk($100000);
|
NewPos:=Sbrk(GrowHeapSize);
|
||||||
if NewPos>0 then
|
if NewPos>0 then
|
||||||
size:=$100000;
|
size:=GrowHeapSize;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
NewPos:=SBrk(size);
|
NewPos:=SBrk(size);
|
||||||
@ -1041,7 +1080,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1998-09-14 10:48:17 peter
|
Revision 1.2 1998-10-01 14:55:17 peter
|
||||||
|
+ memorymanager like delphi
|
||||||
|
|
||||||
|
Revision 1.1 1998/09/14 10:48:17 peter
|
||||||
* FPC_ names
|
* FPC_ names
|
||||||
* Heap manager is now system independent
|
* Heap manager is now system independent
|
||||||
|
|
||||||
|
@ -14,8 +14,24 @@
|
|||||||
|
|
||||||
**********************************************************************}
|
**********************************************************************}
|
||||||
|
|
||||||
|
{ Memorymanager }
|
||||||
|
type
|
||||||
|
PMemoryManager = ^TMemoryManager;
|
||||||
|
TMemoryManager = record
|
||||||
|
Getmem : procedure(Var p:pointer;Size:Longint);
|
||||||
|
Freemem : procedure(Var p:pointer;Size:Longint);
|
||||||
|
end;
|
||||||
|
procedure GetMemoryManager(var MemMgr: TMemoryManager);
|
||||||
|
procedure SetMemoryManager(const MemMgr: TMemoryManager);
|
||||||
|
function IsMemoryManagerSet: Boolean;
|
||||||
|
|
||||||
|
Procedure SysGetmem(Var p:pointer;Size:Longint);
|
||||||
|
Procedure SysFreemem(Var p:pointer;Size:Longint);
|
||||||
|
|
||||||
|
{ Variables }
|
||||||
const
|
const
|
||||||
heapblocks : boolean=false;
|
heapblocks : boolean=true;
|
||||||
|
growheapsize : longint=$100000;
|
||||||
var
|
var
|
||||||
heaporg,heapptr,heapend,heaperror,freelist : pointer;
|
heaporg,heapptr,heapend,heaperror,freelist : pointer;
|
||||||
|
|
||||||
@ -47,7 +63,10 @@ Procedure releaseheap(oldfreelist,oldheapptr : pointer);
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.6 1998-09-08 15:03:27 peter
|
Revision 1.7 1998-10-01 14:55:18 peter
|
||||||
|
+ memorymanager like delphi
|
||||||
|
|
||||||
|
Revision 1.6 1998/09/08 15:03:27 peter
|
||||||
* moved getmem/freemem/memavail/maxavail to heaph.inc
|
* moved getmem/freemem/memavail/maxavail to heaph.inc
|
||||||
|
|
||||||
Revision 1.5 1998/07/02 14:11:30 michael
|
Revision 1.5 1998/07/02 14:11:30 michael
|
||||||
|
Loading…
Reference in New Issue
Block a user