123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- {
- 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(go32v2) or defined(wii)}
- {$define USE_STATIC_LIBC}
- {$endif}
- {$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}
- {$ifdef USE_STATIC_LIBC}
- {$linklib c}
- Function malloc (Size : ptruint) : Pointer;cdecl; external;
- Procedure free (P : pointer); cdecl; external;
- function realloc (P : Pointer; Size : ptruint) : pointer;cdecl; external;
- Function calloc (unitSize,UnitCount : ptruint) : pointer;cdecl; external;
- {$else not USE_STATIC_LIBC}
- Function Malloc (Size : ptruint) : Pointer; cdecl; external LibName name 'malloc';
- Procedure Free (P : pointer); cdecl; external LibName name 'free';
- function ReAlloc (P : Pointer; Size : ptruint) : pointer; cdecl; external LibName name 'realloc';
- Function CAlloc (unitSize,UnitCount : ptruint) : pointer; cdecl; external LibName name 'calloc';
- {$endif not USE_STATIC_LIBC}
- 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.
|