|
@@ -0,0 +1,136 @@
|
|
|
+{
|
|
|
+ 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;
|
|
|
+ );
|