Skip to content

Commit bd538f6

Browse files
committed
Compute merged References only on demand by default, fallback to automatic computation available
Make sure the aggregation settings in References can be shared Do not recompute merged References when the auto aggregation property changes Do not display Count column in Fields / References for no selection
1 parent edc874b commit bd538f6

File tree

4 files changed

+151
-34
lines changed

4 files changed

+151
-34
lines changed

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/TruffleObjectPropertyPlugin.java

Lines changed: 131 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
*/
2525
package org.graalvm.visualvm.heapviewer.truffle;
2626

27+
import java.awt.BorderLayout;
28+
import java.awt.GridBagConstraints;
29+
import java.awt.GridBagLayout;
30+
import java.awt.Insets;
2731
import java.awt.event.ActionEvent;
2832
import java.util.List;
2933
import java.util.Objects;
@@ -42,9 +46,13 @@
4246
import org.graalvm.visualvm.heapviewer.ui.TreeTableView;
4347
import org.graalvm.visualvm.heapviewer.ui.TreeTableViewColumn;
4448
import javax.swing.Icon;
49+
import javax.swing.JButton;
4550
import javax.swing.JCheckBoxMenuItem;
51+
import javax.swing.JPanel;
4652
import javax.swing.JPopupMenu;
4753
import javax.swing.SwingUtilities;
54+
import org.graalvm.visualvm.heapviewer.truffle.swing.LinkButton;
55+
import org.graalvm.visualvm.lib.ui.UIUtils;
4856
import org.openide.util.NbBundle;
4957
import org.openide.util.NbPreferences;
5058

@@ -54,15 +62,16 @@
5462
*/
5563
@NbBundle.Messages({
5664
"TruffleObjectPropertyPlugin_NoSelection=<no object selected>",
65+
"TruffleObjectPropertyPlugin_NoSelectionEx=<no object or type selected>",
5766
"TruffleObjectPropertyPlugin_NoItems=<no {0}>", // <no items>
58-
"TruffleObjectPropertyPlugin_ShowMergedSwitch=Show merged {0}"
67+
"TruffleObjectPropertyPlugin_AutoShowMergedSwitch=Compute merged {0} automatically",
68+
"TruffleObjectPropertyPlugin_ComputeMergedReferencesLbl=Compute Merged {0}",
69+
"TruffleObjectPropertyPlugin_ComputeMergedReferencesTtp=Compute merged {0} for the selected type",
70+
"TruffleObjectPropertyPlugin_AutoComputeMergedReferencesLbl=Compute Merged {0} Automatically",
71+
"TruffleObjectPropertyPlugin_AutoComputeMergedReferencesTtp=Compute merged {0} automatically for each selected type"
5972
})
6073
public class TruffleObjectPropertyPlugin<O extends TruffleObject, T extends TruffleType<O>, F extends TruffleLanguageHeapFragment<O, T>, L extends TruffleLanguage<O, T, F>> extends HeapViewPlugin {
6174

62-
private static final String KEY_TYPE_PROPERTIES_HISTOGRAM = "tPropertiesHisto"; // NOI18N
63-
64-
private volatile boolean tPropertiesHisto = readItem(KEY_TYPE_PROPERTIES_HISTOGRAM, true);
65-
6675
private static final TreeTableView.ColumnConfiguration CCONF_TYPE = new TreeTableView.ColumnConfiguration(DataType.COUNT, null, DataType.COUNT, SortOrder.DESCENDING, Boolean.FALSE);
6776
private static final TreeTableView.ColumnConfiguration CCONF_OBJECT = new TreeTableView.ColumnConfiguration(null, DataType.COUNT, DataType.NAME, SortOrder.UNSORTED, null);
6877

@@ -72,6 +81,8 @@ public class TruffleObjectPropertyPlugin<O extends TruffleObject, T extends Truf
7281

7382
private HeapViewerNode selected;
7483

84+
private volatile boolean mergedRequest;
85+
7586
private final TreeTableView objectsView;
7687

7788

@@ -80,34 +91,45 @@ public TruffleObjectPropertyPlugin(String name, String description, Icon icon, S
8091

8192
this.provider = provider;
8293

83-
if (!provider.supportsAggregation()) tPropertiesHisto = false;
94+
final String mergedPropertiesKey = provider.getMergedPropertiesKey();
8495

8596
heap = context.getFragment().getHeap();
8697

87-
TreeTableViewColumn[] columns = provider.supportsAggregation() ?
98+
TreeTableViewColumn[] columns = mergedPropertiesKey == null ?
8899
new TreeTableViewColumn[] {
89100
new TreeTableViewColumn.Name(heap),
90101
new TreeTableViewColumn.LogicalValue(heap),
91-
new TreeTableViewColumn.Count(heap, true, true),
92102
new TreeTableViewColumn.OwnSize(heap, false, false),
93103
new TreeTableViewColumn.RetainedSize(heap, false, false),
94104
new TreeTableViewColumn.ObjectID(heap)
95105
} : new TreeTableViewColumn[] {
96106
new TreeTableViewColumn.Name(heap),
97107
new TreeTableViewColumn.LogicalValue(heap),
108+
new TreeTableViewColumn.Count(heap, true, true),
98109
new TreeTableViewColumn.OwnSize(heap, false, false),
99110
new TreeTableViewColumn.RetainedSize(heap, false, false),
100111
new TreeTableViewColumn.ObjectID(heap)
101112
};
102113
objectsView = new TreeTableView(viewID, context, actions, columns) {
103114
protected HeapViewerNode[] computeData(RootNode root, Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
115+
if (mergedRequest) return HeapViewerNode.NO_NODES;
116+
104117
HeapViewerNode _selected;
105118
synchronized (objectsView) { _selected = selected; }
106119

107-
if (_selected == null) return new HeapViewerNode[] { new TextNode(Bundle.TruffleObjectPropertyPlugin_NoSelection()) };
120+
if (_selected == null) {
121+
SwingUtilities.invokeLater(new Runnable() {
122+
public void run() {
123+
if (!CCONF_OBJECT.equals(objectsView.getCurrentColumnConfiguration()))
124+
objectsView.configureColumns(CCONF_OBJECT);
125+
}
126+
});
127+
128+
return new HeapViewerNode[] { new TextNode(noSelectionString()) };
129+
}
108130

109131
HeapViewerNode[] nodes;
110-
TruffleObjectsWrapper wrapper = !tPropertiesHisto ? null : HeapViewerNode.getValue(_selected, TruffleObjectsWrapper.DATA_TYPE, heap);
132+
TruffleObjectsWrapper wrapper = mergedPropertiesKey == null ? null : HeapViewerNode.getValue(_selected, TruffleObjectsWrapper.DATA_TYPE, heap);
111133
if (wrapper != null) {
112134
nodes = provider.getNodes(wrapper, _selected, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
113135
SwingUtilities.invokeLater(new Runnable() {
@@ -119,7 +141,7 @@ public void run() {
119141
} else {
120142
O selectedO = provider.getObject(_selected, heap);
121143
if (selectedO != null) nodes = provider.getNodes(selectedO, root, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
122-
else nodes = new HeapViewerNode[] { new TextNode(Bundle.TruffleObjectPropertyPlugin_NoSelection()) };
144+
else nodes = new HeapViewerNode[] { new TextNode(noSelectionString()) };
123145
SwingUtilities.invokeLater(new Runnable() {
124146
public void run() {
125147
if (!CCONF_OBJECT.equals(objectsView.getCurrentColumnConfiguration()))
@@ -132,29 +154,114 @@ public void run() {
132154
}
133155
@Override
134156
protected void populatePopup(HeapViewerNode node, JPopupMenu popup) {
135-
if (!provider.supportsAggregation()) return;
157+
if (provider.getMergedPropertiesKey() == null) return;
136158

137159
if (popup.getComponentCount() > 0) popup.addSeparator();
138160

139-
popup.add(new JCheckBoxMenuItem(Bundle.TruffleObjectPropertyPlugin_ShowMergedSwitch(provider.getName()), tPropertiesHisto) {
161+
popup.add(new JCheckBoxMenuItem(Bundle.TruffleObjectPropertyPlugin_AutoShowMergedSwitch(provider.getName()), isAutoMerge()) {
140162
@Override
141163
protected void fireActionPerformed(ActionEvent event) {
142164
SwingUtilities.invokeLater(new Runnable() {
143165
@Override
144166
public void run() {
145-
tPropertiesHisto = isSelected();
146-
storeItem(KEY_TYPE_PROPERTIES_HISTOGRAM, tPropertiesHisto);
147-
reloadView();
167+
setAutoMerge(isSelected());
148168
}
149169
});
150170
}
151171
});
152172
}
153173
};
154174
}
175+
176+
private String noSelectionString() {
177+
return provider.getMergedPropertiesKey() == null ? Bundle.TruffleObjectPropertyPlugin_NoSelection() :
178+
Bundle.TruffleObjectPropertyPlugin_NoSelectionEx();
179+
}
180+
181+
private JComponent component;
182+
183+
private void showObjectsView() {
184+
JComponent c = objectsView.getComponent();
185+
if (c.isVisible()) return;
186+
187+
c.setVisible(true);
188+
189+
component.removeAll();
190+
component.add(c, BorderLayout.CENTER);
191+
192+
mergedRequest = false;
193+
194+
component.invalidate();
195+
component.revalidate();
196+
component.repaint();
197+
}
198+
199+
private void showMergedView() {
200+
JComponent c = objectsView.getComponent();
201+
if (!c.isVisible()) return;
202+
203+
c.setVisible(false);
204+
205+
component.removeAll();
206+
207+
String name = provider.getName();
208+
String _name = name.substring(0, 1).toUpperCase() + name.substring(1);
209+
210+
JButton jb = new JButton(Bundle.TruffleObjectPropertyPlugin_ComputeMergedReferencesLbl(_name), getIcon()) {
211+
protected void fireActionPerformed(ActionEvent e) {
212+
showObjectsView();
213+
objectsView.reloadView();
214+
}
215+
};
216+
jb.setIconTextGap(jb.getIconTextGap() + 2);
217+
jb.setToolTipText(Bundle.TruffleObjectPropertyPlugin_ComputeMergedReferencesTtp(name));
218+
Insets margin = jb.getMargin();
219+
if (margin != null) jb.setMargin(new Insets(margin.top + 3, margin.left + 3, margin.bottom + 3, margin.right + 3));
220+
221+
222+
LinkButton lb = new LinkButton(Bundle.TruffleObjectPropertyPlugin_AutoComputeMergedReferencesLbl(_name)) {
223+
protected void fireActionPerformed(ActionEvent e) {
224+
setAutoMerge(true);
225+
showObjectsView();
226+
objectsView.reloadView();
227+
}
228+
};
229+
lb.setToolTipText(Bundle.TruffleObjectPropertyPlugin_AutoComputeMergedReferencesTtp(name));
230+
231+
232+
JPanel p = new JPanel(new GridBagLayout());
233+
p.setOpaque(false);
234+
GridBagConstraints g;
235+
236+
g = new GridBagConstraints();
237+
g.fill = GridBagConstraints.HORIZONTAL;
238+
g.gridy = 0;
239+
p.add(jb, g);
240+
241+
g = new GridBagConstraints();
242+
g.fill = GridBagConstraints.HORIZONTAL;
243+
g.gridy = 1;
244+
g.insets = new Insets(10, 0, 0, 0);
245+
p.add(lb, g);
246+
247+
component.add(p);
248+
249+
mergedRequest = true;
250+
251+
component.invalidate();
252+
component.revalidate();
253+
component.repaint();
254+
}
155255

156256
protected JComponent createComponent() {
157-
return objectsView.getComponent();
257+
component = new JPanel(new BorderLayout());
258+
component.setOpaque(true);
259+
component.setBackground(UIUtils.getProfilerResultsBackground());
260+
261+
objectsView.getComponent().setVisible(false); // force init in showObjectsView()
262+
showObjectsView();
263+
264+
return component;
158265
}
159266

160267

@@ -164,28 +271,25 @@ protected void closed() {
164271
}
165272

166273

167-
protected final boolean supportsAggregation() {
168-
return provider.supportsAggregation();
169-
}
170-
171-
172274
protected void nodeSelected(HeapViewerNode node, boolean adjusting) {
173275
synchronized (objectsView) {
174276
if (Objects.equals(selected, node)) return;
175-
176277
selected = node;
177278
}
178279

280+
if (selected != null && provider.getMergedPropertiesKey() != null && !isAutoMerge() && HeapViewerNode.getValue(selected, TruffleObjectsWrapper.DATA_TYPE, heap) != null) showMergedView();
281+
else showObjectsView();
282+
179283
objectsView.reloadView();
180284
}
181285

182286

183-
private static boolean readItem(String itemName, boolean initial) {
184-
return NbPreferences.forModule(TruffleObjectPropertyPlugin.class).getBoolean("TruffleObjectPropertyPlugin." + itemName, initial); // NOI18N
287+
private boolean isAutoMerge() {
288+
return NbPreferences.root().getBoolean(provider.getMergedPropertiesKey(), false);
185289
}
186290

187-
private static void storeItem(String itemName, boolean value) {
188-
NbPreferences.forModule(TruffleObjectPropertyPlugin.class).putBoolean("TruffleObjectPropertyPlugin." + itemName, value); // NOI18N
291+
private void setAutoMerge(boolean value) {
292+
NbPreferences.root().putBoolean(provider.getMergedPropertiesKey(), value);
189293
}
190294

191295
}

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/TruffleObjectPropertyProvider.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ protected final L getLanguage() {
117117
protected abstract HeapViewerNode createNode(I item, Heap heap);
118118

119119

120-
protected boolean supportsAggregation() { return true; }
120+
protected String getMergedPropertiesKey() { return null; }
121121

122122

123123
protected final boolean filtersProperties() { return filtersProperties; }
@@ -253,9 +253,16 @@ protected HeapViewerNode createForeignFieldNode(Instance instance, FieldValue fi
253253
}
254254
}
255255

256+
257+
@Override
258+
protected String getMergedPropertiesKey() {
259+
return "HeapViewer.autoMergedFields"; // NOI18N
260+
}
261+
262+
256263
@Override
257264
protected HeapViewerNode[] getNodes(TruffleObjectsWrapper<O> objects, HeapViewerNode parent, final Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
258-
if (!supportsAggregation()) return null;
265+
if (getMergedPropertiesKey() == null) return null;
259266

260267
return new TruffleObjectMergedFields<O>(objects, heap) {
261268
protected String getMoreNodesString(String moreNodesCount) { return moreNodesString(moreNodesCount); }
@@ -321,9 +328,15 @@ protected HeapViewerNode createForeignReferenceNode(Instance instance, FieldValu
321328
}
322329

323330

331+
@Override
332+
protected String getMergedPropertiesKey() {
333+
return "HeapViewer.autoMergedReferences"; // NOI18N // Shared with org.graalvm.visualvm.heapviewer.java.impl.JavaReferencesPlugin
334+
}
335+
336+
324337
@Override
325338
protected HeapViewerNode[] getNodes(final TruffleObjectsWrapper<O> objects, HeapViewerNode parent, final Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
326-
if (!supportsAggregation()) return null;
339+
if (getMergedPropertiesKey() == null) return null;
327340

328341
return new TruffleObjectMergedReferences<O>(objects, heap) {
329342
protected String getMoreNodesString(String moreNodesCount) { return moreNodesString(moreNodesCount); }

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/python/PythonObjectProperties.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ protected boolean includeInstance(Instance instance) {
157157
}
158158

159159
@Override
160-
protected boolean supportsAggregation() {
161-
return false;
160+
protected String getMergedPropertiesKey() {
161+
return null;
162162
}
163163

164164
}

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/r/RObjectProperties.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ protected boolean includeInstance(Instance instance) {
179179
}
180180

181181
@Override
182-
protected boolean supportsAggregation() {
183-
return false;
182+
protected String getMergedPropertiesKey() {
183+
return null;
184184
}
185185

186186
}

0 commit comments

Comments
 (0)