-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUnitMemoryManager.pas
103 lines (78 loc) · 2.14 KB
/
UnitMemoryManager.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
unit UnitMemoryManager;
interface
procedure SetDebugMemoryManager;
procedure RestoreMemoryManager;
function GetMaxMemoryUsage: Cardinal;
procedure ResetMaxMemoryUsage;
function GetMemoryUsage: Cardinal;
var
DebugTest: boolean = false;
implementation
var
SystemMemoryManager : TMemoryManagerEx;
MemoryUsage: Cardinal;
MaxMemoryUsage: Cardinal;
function GetMaxMemoryUsage: Cardinal;
begin
Result := MaxMemoryUsage;
end;
procedure ResetMaxMemoryUsage;
begin
MaxMemoryUsage := 0;
end;
function GetMemoryUsage: Cardinal;
var
MMS: TMemoryManagerState;
sb: TSmallBlockTypeState;
begin
GetMemoryManagerState(MMS);
Result := MMS.TotalAllocatedMediumBlockSize + MMS.TotalAllocatedLargeBlockSize;
for sb in MMS.SmallBlockTypeStates do
Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;
procedure UpdateStatistics;
begin
MemoryUsage := GetMemoryUsage;
if MemoryUsage > MaxMemoryUsage then
MaxMemoryUsage := MemoryUsage;
end;
function DebugGetMem(Size: Integer): Pointer;
begin
Result := SystemMemoryManager.GetMem(Size);
UpdateStatistics;
end;
function DebugFreeMem(P: Pointer): Integer;
begin
Result := SystemMemoryManager.FreeMem(P);
end;
function DebugReallocMem(P: Pointer; Size: Integer): Pointer;
begin
Result := SystemMemoryManager.ReallocMem(P, Size);
UpdateStatistics;
end;
function DebugAllocMem(Size: Cardinal): Pointer;
begin
Result := SystemMemoryManager.AllocMem(Size);
UpdateStatistics;
end;
procedure SetDebugMemoryManager;
var
DebugMemoryManager: TMemoryManagerEx;
begin
GetMemoryManager(SystemMemoryManager);
DebugMemoryManager.GetMem := DebugGetMem;
DebugMemoryManager.FreeMem := DebugFreeMem;
DebugMemoryManager.ReallocMem := DebugReallocMem;
DebugMemoryManager.AllocMem := DebugAllocMem;
DebugMemoryManager.RegisterExpectedMemoryLeak := SystemMemoryManager.RegisterExpectedMemoryLeak;
DebugMemoryManager.UnregisterExpectedMemoryLeak := SystemMemoryManager.UnregisterExpectedMemoryLeak;
SetMemoryManager(DebugMemoryManager);
end;
procedure RestoreMemoryManager;
begin
SetMemoryManager(SystemMemoryManager);
end;
initialization
MemoryUsage := 0;
MaxMemoryUsage := 0;
end.