mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 04:52:42 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			170 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
|     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
 | |
| 
 | |
| {$if defined(win32)}
 | |
|   LibName = 'msvcrt';
 | |
| {$elseif defined(win64)}
 | |
|   LibName = 'msvcrt';
 | |
| {$elseif defined(wince)}
 | |
|   LibName = 'coredll';
 | |
| {$elseif defined(netware)}
 | |
|   LibName = 'clib';
 | |
| {$elseif defined(netwlibc)}
 | |
|   LibName = 'libc';
 | |
| {$elseif defined(macos)}
 | |
|   LibName = 'StdCLib';
 | |
| {$elseif defined(beos)}
 | |
|   LibName = 'root';
 | |
| {$else}
 | |
|   LibName = 'c';
 | |
| {$endif}
 | |
| 
 | |
| Function Malloc (Size : ptruint) : 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 : ptruint) : pointer; {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'realloc';
 | |
| Function CAlloc (unitSize,UnitCount : ptruint) : pointer; {$ifdef win32}stdcall{$else}cdecl{$endif}; external LibName name 'calloc';
 | |
| 
 | |
| implementation
 | |
| 
 | |
| Function CGetMem  (Size : ptruint) : Pointer;
 | |
| 
 | |
| begin
 | |
|   CGetMem:=Malloc(Size+sizeof(ptruint));
 | |
|   if (CGetMem <> nil) then
 | |
|     begin
 | |
|       Pptruint(CGetMem)^ := size;
 | |
|       inc(CGetMem,sizeof(ptruint));
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function CFreeMem (P : pointer) : ptruint;
 | |
| 
 | |
| begin
 | |
|   if (p <> nil) then
 | |
|     dec(p,sizeof(ptruint));
 | |
|   Free(P);
 | |
|   CFreeMem:=0;
 | |
| end;
 | |
| 
 | |
| Function CFreeMemSize(p:pointer;Size:ptruint):ptruint;
 | |
| 
 | |
| begin
 | |
|   if size<=0 then
 | |
|     exit;
 | |
|   if (p <> nil) then
 | |
|     begin
 | |
|       if (size <> Pptruint(p-sizeof(ptruint))^) then
 | |
|         runerror(204);
 | |
|     end;
 | |
|   CFreeMemSize:=CFreeMem(P);
 | |
| end;
 | |
| 
 | |
| Function CAllocMem(Size : ptruint) : Pointer;
 | |
| 
 | |
| begin
 | |
|   CAllocMem:=calloc(Size+sizeof(ptruint),1);
 | |
|   if (CAllocMem <> nil) then
 | |
|     begin
 | |
|       Pptruint(CAllocMem)^ := size;
 | |
|       inc(CAllocMem,sizeof(ptruint));
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function CReAllocMem (var p:pointer;Size:ptruint):Pointer;
 | |
| 
 | |
| begin
 | |
|   if size=0 then
 | |
|     begin
 | |
|       if p<>nil then
 | |
|         begin
 | |
|           dec(p,sizeof(ptruint));
 | |
|           free(p);
 | |
|           p:=nil;
 | |
|         end;
 | |
|     end
 | |
|   else
 | |
|     begin
 | |
|       inc(size,sizeof(ptruint));
 | |
|       if p=nil then
 | |
|         p:=malloc(Size)
 | |
|       else
 | |
|         begin
 | |
|           dec(p,sizeof(ptruint));
 | |
|           p:=realloc(p,size);
 | |
|         end;
 | |
|       if (p <> nil) then
 | |
|         begin
 | |
|           Pptruint(p)^ := size-sizeof(ptruint);
 | |
|           inc(p,sizeof(ptruint));
 | |
|         end;
 | |
|     end;
 | |
|   CReAllocMem:=p;
 | |
| end;
 | |
| 
 | |
| Function CMemSize (p:pointer): ptruint;
 | |
| 
 | |
| begin
 | |
|   CMemSize:=Pptruint(p-sizeof(ptruint))^;
 | |
| end;
 | |
| 
 | |
| function CGetHeapStatus:THeapStatus;
 | |
| 
 | |
| var res: THeapStatus;
 | |
| 
 | |
| begin
 | |
|   fillchar(res,sizeof(res),0);
 | |
|   CGetHeapStatus:=res;
 | |
| end;
 | |
| 
 | |
| function CGetFPCHeapStatus:TFPCHeapStatus;
 | |
| 
 | |
| begin
 | |
|   fillchar(CGetFPCHeapStatus,sizeof(CGetFPCHeapStatus),0);
 | |
| end;
 | |
| 
 | |
| Const
 | |
|  CMemoryManager : TMemoryManager =
 | |
|     (
 | |
|       NeedLock : false;
 | |
|       GetMem : @CGetmem;
 | |
|       FreeMem : @CFreeMem;
 | |
|       FreememSize : @CFreememSize;
 | |
|       AllocMem : @CAllocMem;
 | |
|       ReallocMem : @CReAllocMem;
 | |
|       MemSize : @CMemSize;
 | |
|       InitThread : nil;
 | |
|       DoneThread : nil;
 | |
|       RelocateHeap : nil;
 | |
|       GetHeapStatus : @CGetHeapStatus;
 | |
|       GetFPCHeapStatus: @CGetFPCHeapStatus;	
 | |
|     );
 | |
| 
 | |
| Var
 | |
|   OldMemoryManager : TMemoryManager;
 | |
| 
 | |
| Initialization
 | |
|   GetMemoryManager (OldMemoryManager);
 | |
|   SetMemoryManager (CmemoryManager);
 | |
| 
 | |
| Finalization
 | |
|   SetMemoryManager (OldMemoryManager);
 | |
| end.
 | 
