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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code 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. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
Defines TCodeToolMemManager, which is the base class for the various
memory manager in the codetools. An own memory manager is somewhat faster
and makes debugging and profiling easier.
}
unit CodeToolMemManager;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
PCodeToolMemManagerItem = ^TCodeToolMemManagerItem;
TCodeToolMemManagerItem = record
Next: PCodeToolMemManagerItem;
end;
// memory manager template
TCodeToolMemManager = class
private
procedure SetMaxFreeRatio(NewValue: integer);
procedure SetMinFree(NewValue: integer);
protected
FFirstFree: PCodeToolMemManagerItem;
FFreeCount: integer;
FCount: integer;
FMinFree: integer;
FMaxFreeRatio: integer;
{$IFDEF DebugCTMemManager}
FAllocatedCount: int64;
FFreedCount: int64;
{$ENDIF}
procedure DisposeItem({%H-}AnItem: PCodeToolMemManagerItem);
function NewItem: PCodeToolMemManagerItem;
procedure FreeFirstItem; virtual;
public
property MinimumFreeCount: integer read FMinFree write SetMinFree;
property MaximumFreeCountRatio: integer
read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
property Count: integer read FCount;
property FreeCount: integer read FFreeCount;
{$IFDEF DebugCTMemManager}
property AllocatedCount: int64 read FAllocatedCount;
property FreedCount: int64 read FFreedCount;
{$ENDIF}
procedure Clear;
constructor Create;
destructor Destroy; override;
end;
implementation
{ TCodeToolMemManager }
procedure TCodeToolMemManager.Clear;
begin
while FFirstFree<>nil do begin
FreeFirstItem;
{$IFDEF DebugCTMemManager}
inc(FFreedCount);
{$ENDIF}
end;
FFreeCount:=0;
end;
constructor TCodeToolMemManager.Create;
begin
inherited Create;
FFirstFree:=nil;
FFreeCount:=0;
FCount:=0;
{$IFDEF DebugCTMemManager}
FAllocatedCount:=0;
FFreedCount:=0;
{$ENDIF}
FMinFree:=100000;
FMaxFreeRatio:=8; // 1:1
end;
destructor TCodeToolMemManager.Destroy;
begin
Clear;
inherited Destroy;
end;
procedure TCodeToolMemManager.DisposeItem(AnItem: PCodeToolMemManagerItem);
begin
if (FFreeCount<FMinFree) or (FFreeCount<((FCount shr 3)*FMaxFreeRatio)) then
begin
// add ANode to Free list
//AddItemToFreeList(AnItem);
inc(FFreeCount);
end else begin
// free list full -> free the ANode
//FreeItem(AnItem);
{$IFDEF DebugCTMemManager}
inc(FFreedCount);
{$ENDIF}
end;
dec(FCount);
end;
function TCodeToolMemManager.NewItem: PCodeToolMemManagerItem;
begin
if FFirstFree<>nil then begin
// take from free list
Result:=FFirstFree;
FFirstFree:=FFirstFree^.Next;
Result^.Next:=nil;
dec(FFreeCount);
end else begin
// free list empty -> create new node
New(Result);
{$IFDEF DebugCTMemManager}
inc(FAllocatedCount);
{$ENDIF}
end;
inc(FCount);
end;
procedure TCodeToolMemManager.SetMaxFreeRatio(NewValue: integer);
begin
if NewValue<0 then NewValue:=0;
if NewValue=FMaxFreeRatio then exit;
FMaxFreeRatio:=NewValue;
end;
procedure TCodeToolMemManager.SetMinFree(NewValue: integer);
begin
if NewValue<0 then NewValue:=0;
if NewValue=FMinFree then exit;
FMinFree:=NewValue;
end;
procedure TCodeToolMemManager.FreeFirstItem;
var Item: PCodeToolMemManagerItem;
begin
Item:=FFirstFree;
FFirstFree:=FFirstFree^.Next;
Dispose(Item);
end;
end.
|