Skip to content

Commit 16154bc

Browse files
committed
Fix ColumnInfoCollection leak
Use HashSet<string> instead of ColumnInfoCollection
1 parent a876491 commit 16154bc

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -790,20 +790,19 @@ private static IEnumerable<TypeInfo> GatherDescendants(TypeInfo type, ICollectio
790790
private IEnumerable<ColumnInfo> GatherValueColumns(IEnumerable<ColumnInfo> columns)
791791
{
792792
var nameBuilder = context.NameBuilder;
793-
var valueColumns = new ColumnInfoCollection(null, "ValueColumns");
793+
var valueColumns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
794794
foreach (var column in columns) {
795-
if (valueColumns.Contains(column.Name)) {
796-
if (column.IsSystem)
797-
continue;
795+
if (valueColumns.Add(column.Name)) {
796+
yield return column;
797+
}
798+
else if (!column.IsSystem) {
798799
var clone = column.Clone();
799800
clone.Name = nameBuilder.BuildColumnName(column);
800801
clone.Field.MappingName = clone.Name;
801-
valueColumns.Add(clone);
802+
_ = valueColumns.Add(clone.Name);
803+
yield return clone;
802804
}
803-
else
804-
valueColumns.Add(column);
805805
}
806-
return valueColumns;
807806
}
808807

809808
private ColumnGroup BuildColumnGroup(IndexInfo index)

Orm/Xtensive.Orm/Orm/Model/ColumnInfoCollection.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,8 @@ public ICollection<ColumnInfo> Find(ColumnAttributes criteria, MatchType matchTy
5050

5151
/// <inheritdoc/>
5252
public ColumnInfoCollection(Node owner, string name)
53-
: base(owner, name)
53+
: base(owner, name, new Dictionary<string, ColumnInfo>(StringComparer.OrdinalIgnoreCase))
5454
{
55-
NameIndex = new Dictionary<string, ColumnInfo>(StringComparer.OrdinalIgnoreCase);
5655
}
5756
}
5857
}

Orm/Xtensive.Orm/Orm/Model/NodeCollection.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class NodeCollection<TNode> : CollectionBaseSlim<TNode>
2626
[NonSerialized, DebuggerBrowsable(DebuggerBrowsableState.Never)]
2727
private EventHandler<ChangeNotifierEventArgs> itemChangingHandler;
2828

29-
protected Dictionary<string, TNode> NameIndex = new Dictionary<string, TNode>();
29+
protected readonly Dictionary<string, TNode> NameIndex;
3030

3131
/// <summary>
3232
/// Gets empty collection.
@@ -221,8 +221,14 @@ public override void Lock(bool recursive)
221221
/// <param name="owner">The owner.</param>
222222
/// <param name="name">The name.</param>
223223
public NodeCollection(Node owner, string name)
224+
: this(owner, name, new Dictionary<string, TNode>())
225+
{
226+
}
227+
228+
protected NodeCollection(Node owner, string name, Dictionary<string, TNode> nameIndex)
224229
{
225230
ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name");
231+
NameIndex = nameIndex;
226232
Owner = owner;
227233
Name = name;
228234
itemChangingHandler = OnItemChanging;

0 commit comments

Comments
 (0)