mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-26 15:53:44 +02:00
229 lines
4.9 KiB
ObjectPascal
229 lines
4.9 KiB
ObjectPascal
{
|
|
$Id$
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 1999 by Michael Van Canneyt, member of the
|
|
Free Pascal development team
|
|
|
|
Implements a memory manager that uses the C memory management.
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
unit cmem;
|
|
|
|
interface
|
|
|
|
Const
|
|
{$ifndef win32}
|
|
{$ifdef netware}
|
|
LibName = 'clib';
|
|
{$else}
|
|
{$ifdef netwlibc}
|
|
LibName = 'libc';
|
|
{$else}
|
|
{$ifdef macos}
|
|
LibName = 'StdCLib';
|
|
{$else}
|
|
LibName = 'c';
|
|
{$endif macos}
|
|
{$endif netwlibc}
|
|
{$endif}
|
|
{$else}
|
|
LibName = 'msvcrt';
|
|
{$endif}
|
|
|
|
Function Malloc (Size : ptrint) : Pointer; {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'malloc';
|
|
Procedure Free (P : pointer); {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'free';
|
|
function ReAlloc (P : Pointer; Size : ptrint) : pointer; {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'realloc';
|
|
Function CAlloc (unitSize,UnitCount : ptrint) : pointer; {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'calloc';
|
|
|
|
implementation
|
|
|
|
type
|
|
pptrint = ^ptrint;
|
|
|
|
Function CGetMem (Size : ptrint) : Pointer;
|
|
|
|
begin
|
|
CGetMem:=Malloc(Size+sizeof(ptrint));
|
|
if (CGetMem <> nil) then
|
|
begin
|
|
pptrint(CGetMem)^ := size;
|
|
inc(CGetMem,sizeof(ptrint));
|
|
end;
|
|
end;
|
|
|
|
Function CFreeMem (P : pointer) : ptrint;
|
|
|
|
begin
|
|
if (p <> nil) then
|
|
dec(p,sizeof(ptrint));
|
|
Free(P);
|
|
CFreeMem:=0;
|
|
end;
|
|
|
|
Function CFreeMemSize(p:pointer;Size:ptrint):ptrint;
|
|
|
|
begin
|
|
if (p <> nil) then
|
|
begin
|
|
if (size <> pptrint(p-sizeof(ptrint))^) then
|
|
runerror(204);
|
|
end;
|
|
CFreeMemSize:=CFreeMem(P);
|
|
end;
|
|
|
|
Function CAllocMem(Size : ptrint) : Pointer;
|
|
|
|
begin
|
|
CAllocMem:=calloc(Size+sizeof(ptrint),1);
|
|
if (CAllocMem <> nil) then
|
|
begin
|
|
pptrint(CAllocMem)^ := size;
|
|
inc(CAllocMem,sizeof(ptrint));
|
|
end;
|
|
end;
|
|
|
|
Function CReAllocMem (var p:pointer;Size:ptrint):Pointer;
|
|
|
|
begin
|
|
if size=0 then
|
|
begin
|
|
if p<>nil then
|
|
begin
|
|
dec(p,sizeof(ptrint));
|
|
free(p);
|
|
p:=nil;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
inc(size,sizeof(ptrint));
|
|
if p=nil then
|
|
p:=malloc(Size)
|
|
else
|
|
begin
|
|
dec(p,sizeof(ptrint));
|
|
p:=realloc(p,size);
|
|
end;
|
|
if (p <> nil) then
|
|
begin
|
|
pptrint(p)^ := size-sizeof(ptrint);
|
|
inc(p,sizeof(ptrint));
|
|
end;
|
|
end;
|
|
CReAllocMem:=p;
|
|
end;
|
|
|
|
Function CMemSize (p:pointer): ptrint;
|
|
|
|
begin
|
|
CMemSize:=pptrint(p-sizeof(ptrint))^;
|
|
end;
|
|
|
|
Function CMemAvail : ptrint;
|
|
|
|
begin
|
|
CMemAvail:=0;
|
|
end;
|
|
|
|
Function CMaxAvail: ptrint;
|
|
|
|
begin
|
|
CMaxAvail:=0;
|
|
end;
|
|
|
|
Function CHeapSize : ptrint;
|
|
|
|
begin
|
|
CHeapSize:=0;
|
|
end;
|
|
|
|
|
|
Const
|
|
CMemoryManager : TMemoryManager =
|
|
(
|
|
NeedLock : false;
|
|
GetMem : @CGetmem;
|
|
FreeMem : @CFreeMem;
|
|
FreememSize : @CFreememSize;
|
|
AllocMem : @CAllocMem;
|
|
ReallocMem : @CReAllocMem;
|
|
MemSize : @CMemSize;
|
|
MemAvail : @CMemAvail;
|
|
MaxAvail : @CMaxAvail;
|
|
HeapSize : @CHeapSize;
|
|
);
|
|
|
|
Var
|
|
OldMemoryManager : TMemoryManager;
|
|
|
|
Initialization
|
|
GetMemoryManager (OldMemoryManager);
|
|
SetMemoryManager (CmemoryManager);
|
|
|
|
Finalization
|
|
SetMemoryManager (OldMemoryManager);
|
|
end.
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.8 2004-09-19 08:16:03 olle
|
|
* reverted to $ifdef style, so 1.0.x can eat it.
|
|
|
|
Revision 1.7 2004/09/18 08:40:26 olle
|
|
+ added support for macos
|
|
|
|
Revision 1.6 2004/09/15 20:37:42 armin
|
|
* add support for netware libc
|
|
|
|
Revision 1.5 2004/05/05 13:00:43 jonas
|
|
* fixed reallocmem (bug noted by Vincent Snijders)
|
|
|
|
Revision 1.4 2004/03/23 22:35:20 peter
|
|
* dec ptr before free in reallocmem
|
|
|
|
Revision 1.3 2004/03/17 12:50:53 michael
|
|
* Fixed: Macavail -> CMaxAvail (from Marc Weustinc)
|
|
|
|
Revision 1.2 2004/03/16 15:25:16 peter
|
|
* adaption to compile with 1.0.x in new rtl
|
|
|
|
Revision 1.1 2004/03/15 21:48:26 peter
|
|
* cmem moved to rtl
|
|
* longint replaced with ptrint in heapmanagers
|
|
|
|
Revision 1.9 2004/03/12 13:08:08 jonas
|
|
+ added memsize() support (needed to use cmem with the compiler)
|
|
|
|
Revision 1.8 2003/03/17 15:40:05 armin
|
|
+ LibName for netware
|
|
|
|
Revision 1.7 2002/11/01 17:56:39 peter
|
|
* needlock field added for 1.1
|
|
|
|
Revision 1.6 2002/09/08 15:43:47 michael
|
|
+ Fixed calling conventions
|
|
|
|
Revision 1.5 2002/09/07 15:42:54 peter
|
|
* old logs removed and tabs fixed
|
|
|
|
Revision 1.4 2002/07/01 16:24:04 peter
|
|
* updates for 1.0 compiler
|
|
|
|
Revision 1.3 2002/06/13 05:01:44 michael
|
|
+ Added windows msvcrt support
|
|
|
|
Revision 1.2 2002/06/13 04:54:47 michael
|
|
+ Fixed parameter type mismatch
|
|
|
|
Revision 1.1 2002/01/29 17:54:59 peter
|
|
* splitted to base and extra
|
|
|
|
}
|