FastShareMem is a very lightweight memory manager for Delphi that was designed to replace the default memory manager that required the inclusion of a dll with applications. However, due to the addition of unicode support to Delphi 2009/2010, the include is no longer compatible with dlls compiled with older versions of Delphi using it. So I’ve written a copy that that will work in Delphi 2009/2010 and still is compatible with the older versions. Due take in mind this version of the include isn’t written for older versions of Delphi. For an older version use the original you can find here: http://www.codexterity.com/fastsharemem.htm
unit FastShareMem;
// By Frederic Hannes (http://ibeblog.com)
// Based on FastShareMem by Emil M. Santos (http://www.codexterity.com)
interface
var
GetAllocMemCount: function: Integer;
GetAllocMemSize: function: Integer;
implementation
uses Windows;
const
ClassName = '_com.codexterity.fastsharemem.dataclass';
type
TFastShareMem = record
MemoryManager: TMemoryManagerEx;
_GetAllocMemSize: function: Integer;
_GetAllocMemCount: function: Integer;
end;
function _GetAllocMemCount: Integer;
var
State: TMemoryManagerState;
i: Integer;
begin
GetMemoryManagerState(State);
Result := 0;
for i := 0 to High(State.SmallBlockTypeStates) do
Inc(Result, State.SmallBlockTypeStates[i].AllocatedBlockCount);
Inc(Result, State.AllocatedMediumBlockCount + State.AllocatedLargeBlockCount);
end;
function _GetAllocMemSize: Integer;
var
State: TMemoryManagerState;
i: Integer;
begin
GetMemoryManagerState(State);
Result := 0;
for i := 0 to High(State.SmallBlockTypeStates) do
Inc(Result, State.SmallBlockTypeStates[i].AllocatedBlockCount *
State.SmallBlockTypeStates[i].UseableBlockSize);
Inc(Result, State.TotalAllocatedMediumBlockSize +
State.TotalAllocatedLargeBlockSize);
end;
var
wc: TWndClassA;
IsHost: Boolean;
ShareMem: TFastShareMem;
initialization
if not GetClassInfoA(HInstance, ClassName, wc) then
begin
GetMemoryManager(ShareMem.MemoryManager);
ShareMem._GetAllocMemCount := @_GetAllocMemCount;
ShareMem._GetAllocMemSize := @_GetAllocMemSize;
GetAllocMemCount := @_GetAllocMemCount;
GetAllocMemSize := @_GetAllocMemSize;
FillChar(wc, SizeOf(wc), 0);
wc.lpszClassName := ClassName;
wc.style := CS_GLOBALCLASS;
wc.hInstance := HInstance;
wc.lpfnWndProc := @ShareMem;
if RegisterClassA(wc) = 0 then
begin
MessageBox(0, 'Shared Memory Allocator setup failed: Cannot register class.',
'FastShareMem', 0);
Halt;
end;
IsHost := True;
end else begin
SetMemoryManager(TFastShareMem(wc.lpfnWndProc^).MemoryManager);
GetAllocMemCount := TFastShareMem(wc.lpfnWndProc^)._GetAllocMemCount;
GetAllocMemSize := TFastShareMem(wc.lpfnWndProc^)._GetAllocMemSize;
IsHost := False;
end;
finalization
if IsHost then
UnregisterClassA(ClassName, HInstance);
end.