Skip to content

Commit 1aae26f

Browse files
committed
Fixed displaying red/green bars in diff results
1 parent 053cf3f commit 1aae26f

File tree

12 files changed

+152
-49
lines changed

12 files changed

+152
-49
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaDiffObjectsView.java

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@
5757
import javax.swing.JMenuItem;
5858
import javax.swing.JPopupMenu;
5959
import javax.swing.JToggleButton;
60+
import javax.swing.SwingUtilities;
6061
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
6162
import org.graalvm.visualvm.lib.ui.swing.GrayLabel;
62-
import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
6363
import org.graalvm.visualvm.lib.ui.swing.renderer.ProfilerRenderer;
6464
import org.graalvm.visualvm.lib.profiler.api.ProfilerDialogs;
6565
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
6666
import org.graalvm.visualvm.lib.profiler.api.icons.LanguageIcons;
6767
import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
68+
import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
69+
import org.graalvm.visualvm.lib.ui.swing.renderer.RelativeRenderer;
6870
import org.openide.util.Exceptions;
6971
import org.openide.util.NbBundle;
7072
import org.openide.util.RequestProcessor;
@@ -111,6 +113,10 @@ private static enum Aggregation {
111113
private HeapViewerNode status;
112114
private List<ClassNode> diffClasses;
113115

116+
private int maxDiffCount = 0;
117+
private long maxDiffSize = 0;
118+
private long maxDiffRetained = 0;
119+
114120
private final PluggableTreeTableView objectsView;
115121
private ProfilerToolbar toolbar;
116122
private JComponent component;
@@ -132,35 +138,45 @@ public JavaDiffObjectsView(HeapContext context1, File file2, final boolean compa
132138

133139
final Heap heap = context1.getFragment().getHeap();
134140

135-
status = new ProgressNode(Bundle.JavaDiffObjectsView_LoadingProgress());
136-
new RequestProcessor("Compare Heap Dumps Worker").post(new Runnable() { // NOI18N
137-
public void run() { computeDiffClasses(heap, compareRetained); }
138-
});
141+
final TreeTableViewColumn countC = new TreeTableViewColumn.Count(heap);
142+
final TreeTableViewColumn sizeC = new TreeTableViewColumn.OwnSize(heap, true, true);
143+
final TreeTableViewColumn retainedC = compareRetained ? new TreeTableViewColumn.RetainedSize(heap) : null;
139144

140-
141145
TreeTableViewColumn[] columns = compareRetained ?
142146
new TreeTableViewColumn[] {
143147
new TreeTableViewColumn.Name(heap),
144148
// new TreeTableViewColumn.LogicalValue(heap),
145-
new TreeTableViewColumn.Count(heap),
146-
new TreeTableViewColumn.OwnSize(heap, true, true),
147-
new TreeTableViewColumn.RetainedSize(heap)
149+
countC,
150+
sizeC,
151+
retainedC
148152
} :
149153
new TreeTableViewColumn[] {
150154
new TreeTableViewColumn.Name(heap),
151155
// new TreeTableViewColumn.LogicalValue(heap),
152-
new TreeTableViewColumn.Count(heap),
153-
new TreeTableViewColumn.OwnSize(heap, true, true)
156+
countC,
157+
sizeC
154158
};
155159

156160
for (TreeTableViewColumn column : columns) {
157161
ProfilerRenderer renderer = column.getRenderer();
158-
if (renderer instanceof HideableBarRenderer) {
159-
HideableBarRenderer brenderer = (HideableBarRenderer)renderer;
160-
brenderer.setDiffMode(true);
161-
}
162+
if (renderer instanceof RelativeRenderer) ((RelativeRenderer)renderer).setDiffMode(true);
162163
}
163164

165+
status = new ProgressNode(Bundle.JavaDiffObjectsView_LoadingProgress());
166+
new RequestProcessor("Compare Heap Dumps Worker").post(new Runnable() { // NOI18N
167+
public void run() {
168+
computeDiffClasses(heap, compareRetained);
169+
SwingUtilities.invokeLater(new Runnable() {
170+
public void run() {
171+
((HideableBarRenderer)countC.getRenderer()).setMaxValue(maxDiffCount);
172+
((HideableBarRenderer)sizeC.getRenderer()).setMaxValue(maxDiffSize);
173+
if (compareRetained) ((HideableBarRenderer)retainedC.getRenderer()).setMaxValue(maxDiffRetained);
174+
if (objectsView != null) objectsView.getComponent().repaint();
175+
}
176+
});
177+
}
178+
});
179+
164180
objectsView = new PluggableTreeTableView("diff_java_objects", context1, actions, columns) { // NOI18N
165181
protected HeapViewerNode[] computeData(RootNode root, Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
166182
synchronized (statusLock) {
@@ -280,7 +296,7 @@ protected void fireItemStateChanged(ItemEvent e) {
280296
}
281297

282298

283-
private void computeDiffClasses(Heap heap, boolean compareRetained) {
299+
private void computeDiffClasses(Heap heap, final boolean compareRetained) {
284300
try {
285301
HeapViewer otherViewer = new HeapViewer(file2);
286302

@@ -292,6 +308,18 @@ private void computeDiffClasses(Heap heap, boolean compareRetained) {
292308
Heap diffHeap = otherContext.getFragment().getHeap();
293309
synchronized (statusLock) {
294310
diffClasses = JavaDiffClassesProvider.createDiffClasses(heap, diffHeap, compareRetained);
311+
312+
for (ClassNode node : diffClasses) {
313+
int count = Math.abs(node.getInstancesCount());
314+
maxDiffCount = Math.max(maxDiffCount, count);
315+
long size = Math.abs(node.getOwnSize());
316+
maxDiffSize = Math.max(maxDiffSize, size);
317+
if (compareRetained) {
318+
long retained = Math.abs(node.getRetainedSize(heap));
319+
maxDiffRetained = Math.max(maxDiffRetained, retained);
320+
}
321+
}
322+
295323
status = null;
296324
}
297325
objectsView.reloadView();
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Manifest-Version: 1.0
22
OpenIDE-Module: org.graalvm.visualvm.lib.ui/1
33
OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/ui/Bundle.properties
4-
OpenIDE-Module-Specification-Version: 1.147
4+
OpenIDE-Module-Specification-Version: 1.148
55

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CPUTableView.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,10 @@ ExportUtils.ExportProvider[] getExportProviders() {
221221

222222
private HideableBarRenderer[] renderers;
223223

224+
HideableBarRenderer.BarDiffMode barDiffMode() {
225+
return HideableBarRenderer.BarDiffMode.MODE_BAR_DIFF;
226+
}
227+
224228
private void initUI() {
225229
tableModel = new CPUTableModel();
226230

@@ -259,11 +263,17 @@ protected void popupHidden() {
259263

260264
renderers = new HideableBarRenderer[5];
261265

266+
HideableBarRenderer.BarDiffMode barDiffMode = barDiffMode();
262267
renderers[0] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer()));
268+
renderers[0].setBarDiffMode(barDiffMode);
263269
renderers[1] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer()));
270+
renderers[1].setBarDiffMode(barDiffMode);
264271
renderers[2] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer()));
272+
renderers[2].setBarDiffMode(barDiffMode);
265273
renderers[3] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer()));
274+
renderers[3].setBarDiffMode(barDiffMode);
266275
renderers[4] = new HideableBarRenderer(new NumberRenderer());
276+
renderers[4].setBarDiffMode(barDiffMode);
267277

268278
long refTime = 123456;
269279
renderers[0].setMaxValue(refTime);

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CPUTreeTableView.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ ExportUtils.ExportProvider[] getExportProviders() {
188188

189189
private HideableBarRenderer[] renderers;
190190

191+
HideableBarRenderer.BarDiffMode barDiffMode() {
192+
return HideableBarRenderer.BarDiffMode.MODE_BAR_DIFF;
193+
}
194+
191195
private void initUI() {
192196
treeTableModel = new CPUTreeTableModel(PrestimeCPUCCTNode.EMPTY);
193197

@@ -228,24 +232,28 @@ protected void popupHidden() {
228232

229233
renderers = new HideableBarRenderer[3];
230234

235+
HideableBarRenderer.BarDiffMode barDiffMode = barDiffMode();
231236
renderers[0] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer())) {
232237
public void setValue(Object value, int row) {
233238
super.setMaxValue(getMaxValue(row, 0));
234239
super.setValue(value, row);
235240
}
236241
};
242+
renderers[0].setBarDiffMode(barDiffMode);
237243
renderers[1] = new HideableBarRenderer(new NumberPercentRenderer(new McsTimeRenderer())) {
238244
public void setValue(Object value, int row) {
239245
super.setMaxValue(getMaxValue(row, 1));
240246
super.setValue(value, row);
241247
}
242248
};
249+
renderers[1].setBarDiffMode(barDiffMode);
243250
renderers[2] = new HideableBarRenderer(new NumberRenderer()) {
244251
public void setValue(Object value, int row) {
245252
super.setMaxValue(getMaxValue(row, 2));
246253
super.setValue(value, row);
247254
}
248255
};
256+
renderers[2].setBarDiffMode(barDiffMode);
249257

250258
long refTime = 123456;
251259
renderers[0].setMaxValue(refTime);

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/LiveCPUView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.graalvm.visualvm.lib.ui.swing.ProfilerTreeTable;
8080
import org.graalvm.visualvm.lib.ui.swing.SearchUtils;
8181
import org.graalvm.visualvm.lib.jfluid.utils.Wildcards;
82+
import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
8283

8384
/**
8485
*
@@ -273,6 +274,7 @@ protected void populatePopup(JPopupMenu popup, Object value, ClientUtils.SourceC
273274
protected void popupShowing() { LiveCPUView.this.popupShowing(); }
274275
protected void popupHidden() { LiveCPUView.this.popupHidden(); }
275276
protected boolean hasBottomFilterFindMargin() { return true; }
277+
HideableBarRenderer.BarDiffMode barDiffMode() { return HideableBarRenderer.BarDiffMode.MODE_BAR_NORMAL; }
276278
};
277279
forwardCallsView.notifyOnFocus(new Runnable() {
278280
public void run() { lastFocused = forwardCallsView; }
@@ -288,6 +290,7 @@ protected void populatePopup(JPopupMenu popup, Object value, ClientUtils.SourceC
288290
protected void popupShowing() { LiveCPUView.this.popupShowing(); }
289291
protected void popupHidden() { LiveCPUView.this.popupHidden(); }
290292
protected boolean hasBottomFilterFindMargin() { return true; }
293+
HideableBarRenderer.BarDiffMode barDiffMode() { return HideableBarRenderer.BarDiffMode.MODE_BAR_NORMAL; }
291294
};
292295
hotSpotsView.notifyOnFocus(new Runnable() {
293296
public void run() { lastFocused = hotSpotsView; }

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/AllocTableView.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ public ExportUtils.ExportProvider[] getExportProviders() {
239239

240240
private HideableBarRenderer[] renderers;
241241

242+
HideableBarRenderer.BarDiffMode barDiffMode() {
243+
return HideableBarRenderer.BarDiffMode.MODE_BAR_DIFF;
244+
}
245+
242246
private void initUI() {
243247
final int offset = selection == null ? -1 : 0;
244248

@@ -289,8 +293,12 @@ public boolean include(RowFilter.Entry entry) {
289293
});
290294

291295
renderers = new HideableBarRenderer[2];
296+
297+
HideableBarRenderer.BarDiffMode barDiffMode = barDiffMode();
292298
renderers[0] = new HideableBarRenderer(new NumberPercentRenderer(Formatters.bytesFormat()));
299+
renderers[0].setBarDiffMode(barDiffMode);
293300
renderers[1] = new HideableBarRenderer(new NumberPercentRenderer());
301+
renderers[1].setBarDiffMode(barDiffMode);
294302

295303
renderers[0].setMaxValue(123456789);
296304
renderers[1].setMaxValue(12345678);

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/AllocTreeTableView.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
import org.graalvm.visualvm.lib.jfluid.results.memory.MemoryResultsSnapshot;
7373
import org.graalvm.visualvm.lib.jfluid.results.memory.PresoObjAllocCCTNode;
7474
import org.graalvm.visualvm.lib.ui.Formatters;
75-
import static org.graalvm.visualvm.lib.ui.memory.MemoryView.SEARCH_CLASSES_SCOPE;
7675
import org.graalvm.visualvm.lib.ui.swing.ExportUtils;
7776
import org.graalvm.visualvm.lib.ui.swing.PopupButton;
7877
import org.graalvm.visualvm.lib.ui.swing.ProfilerTable;
@@ -341,6 +340,10 @@ public ExportUtils.ExportProvider[] getExportProviders() {
341340

342341
private HideableBarRenderer[] renderers;
343342

343+
HideableBarRenderer.BarDiffMode barDiffMode() {
344+
return HideableBarRenderer.BarDiffMode.MODE_BAR_DIFF;
345+
}
346+
344347
private void initUI() {
345348
final int offset = selection == null ? -1 : 0;
346349

@@ -394,8 +397,12 @@ public void actionPerformed(ActionEvent e) {
394397
if (selection != null) treeTable.setColumnVisibility(0, false);
395398

396399
renderers = new HideableBarRenderer[2];
400+
401+
HideableBarRenderer.BarDiffMode barDiffMode = barDiffMode();
397402
renderers[0] = new HideableBarRenderer(new NumberPercentRenderer(Formatters.bytesFormat()));
403+
renderers[0].setBarDiffMode(barDiffMode);
398404
renderers[1] = new HideableBarRenderer(new NumberPercentRenderer());
405+
renderers[1].setBarDiffMode(barDiffMode);
399406

400407
renderers[0].setMaxValue(123456789);
401408
renderers[1].setMaxValue(12345678);

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/LiveMemoryView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.graalvm.visualvm.lib.ui.swing.FilterUtils;
6666
import org.graalvm.visualvm.lib.ui.swing.ProfilerTreeTable;
6767
import org.graalvm.visualvm.lib.ui.swing.SearchUtils;
68+
import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
6869

6970
/**
7071
*
@@ -281,6 +282,7 @@ protected void populatePopup(JPopupMenu popup, Object value, ClientUtils.SourceC
281282
protected void popupShowing() { LiveMemoryView.this.popupShowing(); }
282283
protected void popupHidden() { LiveMemoryView.this.popupHidden(); }
283284
protected boolean hasBottomFilterFindMargin() { return true; }
285+
HideableBarRenderer.BarDiffMode barDiffMode() { return HideableBarRenderer.BarDiffMode.MODE_BAR_NORMAL; }
284286
};
285287
} else {
286288
if (dataView instanceof AllocTableView) return;
@@ -295,6 +297,7 @@ protected void populatePopup(JPopupMenu popup, Object value, ClientUtils.SourceC
295297
protected void popupShowing() { LiveMemoryView.this.popupShowing(); }
296298
protected void popupHidden() { LiveMemoryView.this.popupHidden(); }
297299
protected boolean hasBottomFilterFindMargin() { return true; }
300+
HideableBarRenderer.BarDiffMode barDiffMode() { return HideableBarRenderer.BarDiffMode.MODE_BAR_NORMAL; }
298301
};
299302
}
300303
} else if (snapshot instanceof LivenessMemoryResultsSnapshot) {

visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/swing/renderer/HideableBarRenderer.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ public class HideableBarRenderer extends MultiRenderer {
5959
private static final int MAX_BAR_WIDTH = 100;
6060
private static final int OPT_BAR_WIDTH = 50;
6161

62+
63+
public static enum BarDiffMode {
64+
MODE_BAR_DIFF, // divided bar with green/red sections
65+
MODE_BAR_NORMAL, // single bar as if diff was not in effect
66+
MODE_BAR_NONE // no bar (hidden) in diff mode
67+
}
68+
69+
70+
private BarDiffMode barDiffMode = BarDiffMode.MODE_BAR_DIFF;
71+
6272
private int maxRendererWidth;
6373

6474
private final BarRenderer barRenderer;
@@ -87,6 +97,28 @@ public HideableBarRenderer(ProfilerRenderer renderer, int maxWidth) {
8797
}
8898

8999

100+
public void setBarDiffMode(BarDiffMode barDiffMode) {
101+
this.barDiffMode = barDiffMode;
102+
}
103+
104+
public BarDiffMode getBarDiffMode() {
105+
return barDiffMode;
106+
}
107+
108+
109+
public void setDiffMode(boolean diffMode) {
110+
super.setDiffMode(diffMode);
111+
112+
if (!diffMode || BarDiffMode.MODE_BAR_NORMAL.equals(barDiffMode)) {
113+
barRenderer.setVisible(true);
114+
barRenderer.setDiffMode(false);
115+
} else {
116+
if (BarDiffMode.MODE_BAR_NONE.equals(barDiffMode)) barRenderer.setVisible(false);
117+
else if (BarDiffMode.MODE_BAR_DIFF.equals(barDiffMode)) barRenderer.setDiffMode(true);
118+
}
119+
}
120+
121+
90122
public void setMaxValue(long maxValue) {
91123
int oldDigits = Long.toString(barRenderer.getMaxValue()).length();
92124
int newDigits = Long.toString(maxValue).length();
@@ -146,7 +178,7 @@ public void paint(Graphics g) {
146178
component.setSize(componentWidth, size.height);
147179
component.paint(g);
148180

149-
if (numberPercentRenderer == null || numberPercentRenderer.valueRenderers()[1].getComponent().isVisible()) {
181+
if (barRenderer.isVisible()) {
150182
int freeWidth = size.width - maxRendererWidth - renderersGap();
151183
if (freeWidth >= MIN_BAR_WIDTH) {
152184
barRenderer.setSize(Math.min(freeWidth, MAX_BAR_WIDTH), size.height);

0 commit comments

Comments
 (0)