123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2015 by the Free Pascal development team
- This file implements heap management for 16-bit Windows
- using the Windows global heap.
- 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.
- **********************************************************************}
- function SysGlobalGetMem(Size: ptruint): pointer;
- var
- hglob: HGLOBAL;
- begin
- hglob:=GlobalAlloc(HeapAllocFlags, Size);
- if hglob=0 then
- if ReturnNilIfGrowHeapFails then
- begin
- result:=nil;
- exit;
- end
- else
- HandleError(203);
- result:=GlobalLock(hglob);
- if result=nil then
- HandleError(204);
- end;
- function SysGlobalFreeMem(Addr: Pointer): ptruint;
- var
- hglob: HGLOBAL;
- begin
- if Addr<>nil then
- begin
- hglob:=HGLOBAL(GlobalHandle(Seg(Addr^)));
- if hglob=0 then
- HandleError(204);
- result:=GlobalSize(hglob);
- if GlobalUnlock(hglob) then
- HandleError(204);
- if GlobalFree(hglob)<>0 then
- HandleError(204);
- end
- else
- result:=0;
- end;
- function SysGlobalFreeMemSize(Addr: Pointer; Size: Ptruint): ptruint;
- begin
- result:=SysGlobalFreeMem(addr);
- end;
- function SysGlobalAllocMem(size: ptruint): pointer;
- var
- hglob: HGLOBAL;
- begin
- hglob:=GlobalAlloc(HeapAllocFlags or GMEM_ZEROINIT, Size);
- if hglob=0 then
- if ReturnNilIfGrowHeapFails then
- begin
- result:=nil;
- exit;
- end
- else
- HandleError(203);
- result:=GlobalLock(hglob);
- if result=nil then
- HandleError(204);
- end;
- function SysGlobalReAllocMem(var p: pointer; size: ptruint):pointer;
- var
- hglob: HGLOBAL;
- begin
- if size=0 then
- begin
- SysGlobalFreeMem(p);
- result := nil;
- end
- else if p=nil then
- result := SysGlobalAllocMem(size)
- else
- begin
- hglob:=HGLOBAL(GlobalHandle(Seg(p^)));
- if hglob=0 then
- HandleError(204);
- if GlobalUnlock(hglob) then
- HandleError(204);
- hglob:=GlobalReAlloc(hglob,size,HeapAllocFlags or GMEM_ZEROINIT);
- if hglob=0 then
- if ReturnNilIfGrowHeapFails then
- begin
- result:=nil;
- p:=nil;
- exit;
- end
- else
- HandleError(203);
- result:=GlobalLock(hglob);
- if result=nil then
- HandleError(204);
- end;
- p := result;
- end;
- function SysGlobalMemSize(p: pointer): ptruint;
- var
- hglob: HGLOBAL;
- begin
- hglob:=HGLOBAL(GlobalHandle(Seg(p^)));
- if hglob=0 then
- HandleError(204);
- result:=GlobalSize(hglob);
- end;
- const
- GlobalHeapMemoryManager: TMemoryManager = (
- NeedLock: false; // Obsolete
- GetMem: @SysGlobalGetMem;
- FreeMem: @SysGlobalFreeMem;
- FreeMemSize: @SysGlobalFreeMemSize;
- AllocMem: @SysGlobalAllocMem;
- ReAllocMem: @SysGlobalReAllocMem;
- MemSize: @SysGlobalMemSize;
- InitThread: nil;
- DoneThread: nil;
- RelocateHeap: nil;
- GetHeapStatus: nil;
- GetFPCHeapStatus: nil;
- );
|