LCL: TAvgLvlTree: using by default the default memory manager, for multithreading

git-svn-id: trunk@27017 -
This commit is contained in:
mattias 2010-08-06 16:31:27 +00:00
parent 5e807711c8
commit 348d2efab4

View File

@ -49,11 +49,14 @@ type
end; end;
PAvgLvlTreeNode = ^TAvgLvlTreeNode; PAvgLvlTreeNode = ^TAvgLvlTreeNode;
TAvgLvlTreeNodeMemManager = class;
{ TAvgLvlTree } { TAvgLvlTree }
TAvgLvlTree = class TAvgLvlTree = class
private private
FCount: integer; FCount: integer;
FNodeMemManager: TAvgLvlTreeNodeMemManager;
FOnCompare: TListSortCompare; FOnCompare: TListSortCompare;
FOnObjectCompare: TObjectSortCompare; FOnObjectCompare: TObjectSortCompare;
procedure BalanceAfterInsert(ANode: TAvgLvlTreeNode); procedure BalanceAfterInsert(ANode: TAvgLvlTreeNode);
@ -101,6 +104,7 @@ type
function ConsistencyCheck: integer; function ConsistencyCheck: integer;
procedure WriteReportToStream(s: TStream; var StreamSize: TStreamSeekType); procedure WriteReportToStream(s: TStream; var StreamSize: TStreamSeekType);
function ReportAsString: string; function ReportAsString: string;
property NodeMemManager: TAvgLvlTreeNodeMemManager read FNodeMemManager write FNodeMemManager;
constructor Create(OnCompareMethod: TListSortCompare); constructor Create(OnCompareMethod: TListSortCompare);
constructor CreateObjectCompare(OnCompareMethod: TObjectSortCompare); constructor CreateObjectCompare(OnCompareMethod: TObjectSortCompare);
constructor Create; constructor Create;
@ -218,9 +222,6 @@ function ComparePAnsiStringWithStrToStrItemI(Key, Data: Pointer): Integer;
implementation implementation
var NodeMemManager: TAvgLvlTreeNodeMemManager;
function ComparePointer(Data1, Data2: Pointer): integer; function ComparePointer(Data1, Data2: Pointer): integer;
begin begin
if Data1>Data2 then Result:=-1 if Data1>Data2 then Result:=-1
@ -266,7 +267,10 @@ end;
function TAvgLvlTree.Add(Data: Pointer): TAvgLvlTreeNode; function TAvgLvlTree.Add(Data: Pointer): TAvgLvlTreeNode;
begin begin
Result:=NodeMemManager.NewNode; if NodeMemManager<>nil then
Result:=NodeMemManager.NewNode
else
Result:=TAvgLvlTreeNode.Create;
Result.Data:=Data; Result.Data:=Data;
Add(Result); Add(Result);
end; end;
@ -605,7 +609,10 @@ procedure TAvgLvlTree.Clear;
if ANode.Left<>nil then DeleteNode(ANode.Left); if ANode.Left<>nil then DeleteNode(ANode.Left);
if ANode.Right<>nil then DeleteNode(ANode.Right); if ANode.Right<>nil then DeleteNode(ANode.Right);
end; end;
NodeMemManager.DisposeNode(ANode); if NodeMemManager<>nil then
NodeMemManager.DisposeNode(ANode)
else
ANode.Free;
end; end;
// Clear // Clear
@ -661,7 +668,10 @@ begin
Root:=nil; Root:=nil;
end; end;
dec(FCount); dec(FCount);
NodeMemManager.DisposeNode(ANode); if NodeMemManager<>nil then
NodeMemManager.DisposeNode(ANode)
else
ANode.Free;
exit; exit;
end; end;
if (ANode.Right=nil) then begin if (ANode.Right=nil) then begin
@ -684,7 +694,10 @@ begin
Root:=OldLeft; Root:=OldLeft;
end; end;
dec(FCount); dec(FCount);
NodeMemManager.DisposeNode(ANode); if NodeMemManager<>nil then
NodeMemManager.DisposeNode(ANode)
else
ANode.Free;
exit; exit;
end; end;
if (ANode.Left=nil) then begin if (ANode.Left=nil) then begin
@ -707,7 +720,10 @@ begin
Root:=OldRight; Root:=OldRight;
end; end;
dec(FCount); dec(FCount);
NodeMemManager.DisposeNode(ANode); if NodeMemManager<>nil then
NodeMemManager.DisposeNode(ANode)
else
ANode.Free;
exit; exit;
end; end;
// DelNode has both: Left and Right // DelNode has both: Left and Right
@ -1653,11 +1669,4 @@ begin
Result:=GetNode(Node,PrevKey,PrevValue); Result:=GetNode(Node,PrevKey,PrevValue);
end; end;
initialization
NodeMemManager:=TAvgLvlTreeNodeMemManager.Create;
finalization
NodeMemManager.Free;
NodeMemManager:=nil;
end. end.