+ memorymanager like delphi

This commit is contained in:
peter 1998-10-01 14:55:17 +00:00
parent b9c5aa653c
commit 2a14ecc703
2 changed files with 79 additions and 18 deletions

View File

@ -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

View File

@ -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