560440: Possible retention of snapshot via ThreadInfoImpl
Return new Columns
Change-Id: I1beab6fcd67ad7991e258c8bfc53e207d8302fa4
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=560440
diff --git a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/threads/ThreadInfoImpl.java b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/threads/ThreadInfoImpl.java
index 04a9a56..03bbba9 100644
--- a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/threads/ThreadInfoImpl.java
+++ b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/threads/ThreadInfoImpl.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2010 SAP AG & IBM Corporation.
+ * Copyright (c) 2008, 2020 SAP AG & IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -172,7 +172,12 @@
/* package */List<Column> getUsedColumns()
{
List<Column> answer = new ArrayList<Column>();
- answer.addAll(defaultColumns);
+ // Return copy of columns so independent and columns don't permanently retain decorators
+ for (Column col : defaultColumns)
+ {
+ Column col2 = new Column(col.getLabel(), col.getType());
+ answer.add(col2);
+ }
for (IThreadDetailsResolver resolver : ThreadDetailResolverRegistry.instance().delegates())
{
Column[] cols = resolver.getColumns();
@@ -190,7 +195,12 @@
/* package */static List<Column> getUsedColumns(List<ThreadInfoImpl> threads)
{
List<Column> answer = new ArrayList<Column>();
- answer.addAll(defaultColumns);
+ // Return copy of columns so independent and columns don't permanently retain decorators
+ for (Column col : defaultColumns)
+ {
+ Column col2 = new Column(col.getLabel(), col.getType());
+ answer.add(col2);
+ }
for (IThreadDetailsResolver resolver : ThreadDetailResolverRegistry.instance().delegates())
{
Column[] cols = resolver.getColumns();
@@ -325,19 +335,20 @@
public Object getValue(Column column)
{
- if (column == COL_CLASSNAME)
+ // Rely on Column equality via just the label
+ if (COL_CLASSNAME.equals(column))
return getClassName();
- else if (column == COL_NAME)
+ else if (COL_NAME.equals(column))
return getName();
- else if (column == COL_INSTANCE)
+ else if (COL_INSTANCE.equals(column))
return getInstance();
- else if (column == COL_SHALLOW)
+ else if (COL_SHALLOW.equals(column))
return getShallowHeap();
- else if (column == COL_RETAINED)
+ else if (COL_RETAINED.equals(column))
return getRetainedHeap();
- else if (column == COL_CONTEXTCL)
+ else if (COL_CONTEXTCL.equals(column))
return getContextClassLoader();
- else if (column == COL_ISDAEMON)
+ else if (COL_ISDAEMON.equals(column))
return isDaemon();
else
return properties.get(column);