Skip to content

Commit ae7b36f

Browse files
committed
GH-446 make sure timer is stopped when handle is finished
1 parent 076d261 commit ae7b36f

File tree

7 files changed

+96
-79
lines changed

7 files changed

+96
-79
lines changed

visualvm/heapviewer.truffle/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<compile-dependency/>
2222
<run-dependency>
2323
<release-version>2</release-version>
24-
<specification-version>2.4</specification-version>
24+
<specification-version>2.6</specification-version>
2525
</run-dependency>
2626
</dependency>
2727
<dependency>

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

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

27-
import org.graalvm.visualvm.heapviewer.truffle.nodes.TerminalJavaNodes;
28-
import org.graalvm.visualvm.heapviewer.HeapFragment;
27+
import java.util.ArrayList;
28+
import java.util.Collection;
29+
import java.util.Iterator;
30+
import java.util.List;
31+
import javax.swing.SortOrder;
2932
import org.graalvm.visualvm.heapviewer.java.InstanceNode;
3033
import org.graalvm.visualvm.heapviewer.model.DataType;
3134
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
3235
import org.graalvm.visualvm.heapviewer.model.HeapViewerNodeFilter;
3336
import org.graalvm.visualvm.heapviewer.model.Progress;
3437
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObject;
3538
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObjectArrayItemNode;
39+
import org.graalvm.visualvm.heapviewer.truffle.nodes.TerminalJavaNodes;
3640
import org.graalvm.visualvm.heapviewer.ui.UIThresholds;
41+
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
3742
import org.graalvm.visualvm.heapviewer.utils.NodesComputer;
3843
import org.graalvm.visualvm.heapviewer.utils.ProgressIterator;
39-
import java.util.ArrayList;
40-
import java.util.Collection;
41-
import java.util.Iterator;
42-
import java.util.List;
43-
import javax.swing.SortOrder;
44-
import org.netbeans.api.progress.ProgressHandle;
4544
import org.graalvm.visualvm.lib.jfluid.heap.ArrayItemValue;
4645
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
4746
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
@@ -117,10 +116,10 @@ final HeapViewerNode[] getNodes(Instance instance, HeapViewerNode parent, Heap h
117116
if (!displaysProgress) {
118117
itemsC = getPropertyItems(instance);
119118
} else {
120-
ProgressHandle pHandle = ProgressHandle.createHandle(Bundle.TruffleInstancePropertyProvider_ComputingNodes(propertyName));
119+
HeapOperations.OpProgressHandle pHandle = new HeapOperations.OpProgressHandle(Bundle.TruffleInstancePropertyProvider_ComputingNodes(propertyName));
121120
pHandle.setInitialDelay(1000);
122121
pHandle.start(HeapProgress.PROGRESS_MAX);
123-
HeapFragment.setProgress(pHandle, 0);
122+
pHandle.setProgress(0);
124123

125124
try { itemsC = getPropertyItems(instance); }
126125
finally { pHandle.finish(); }

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

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

27-
import org.graalvm.visualvm.heapviewer.truffle.nodes.TerminalJavaNodes;
28-
import org.graalvm.visualvm.heapviewer.HeapFragment;
27+
import java.util.ArrayList;
28+
import java.util.Collection;
29+
import java.util.Iterator;
30+
import java.util.List;
31+
import javax.swing.SortOrder;
2932
import org.graalvm.visualvm.heapviewer.java.PrimitiveNode;
3033
import org.graalvm.visualvm.heapviewer.model.DataType;
3134
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
@@ -34,15 +37,11 @@
3437
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObject;
3538
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObjectFieldNode;
3639
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObjectReferenceNode;
40+
import org.graalvm.visualvm.heapviewer.truffle.nodes.TerminalJavaNodes;
3741
import org.graalvm.visualvm.heapviewer.ui.UIThresholds;
42+
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
3843
import org.graalvm.visualvm.heapviewer.utils.NodesComputer;
3944
import org.graalvm.visualvm.heapviewer.utils.ProgressIterator;
40-
import java.util.ArrayList;
41-
import java.util.Collection;
42-
import java.util.Iterator;
43-
import java.util.List;
44-
import javax.swing.SortOrder;
45-
import org.netbeans.api.progress.ProgressHandle;
4645
import org.graalvm.visualvm.lib.jfluid.heap.FieldValue;
4746
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
4847
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
@@ -138,10 +137,10 @@ final HeapViewerNode[] getNodes(O object, HeapViewerNode parent, Heap heap, Stri
138137
if (!displaysProgress) {
139138
itemsC = getPropertyItems(object, heap);
140139
} else {
141-
ProgressHandle pHandle = ProgressHandle.createHandle(Bundle.TruffleObjectPropertyProvider_ComputingNodes(propertyName));
140+
HeapOperations.OpProgressHandle pHandle = new HeapOperations.OpProgressHandle(Bundle.TruffleObjectPropertyProvider_ComputingNodes(propertyName));
142141
pHandle.setInitialDelay(1000);
143142
pHandle.start(HeapProgress.PROGRESS_MAX);
144-
HeapFragment.setProgress(pHandle, 0);
143+
pHandle.setProgress(0);
145144

146145
try { itemsC = getPropertyItems(object, heap); }
147146
finally { pHandle.finish(); }

visualvm/heapviewer/manifest.mf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ AutoUpdate-Show-In-Client: false
33
AutoUpdate-Essential-Module: true
44
OpenIDE-Module: org.graalvm.visualvm.heapviewer/2
55
OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/heapviewer/Bundle.properties
6-
OpenIDE-Module-Specification-Version: 2.5
6+
OpenIDE-Module-Specification-Version: 2.6
77

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapFragment.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,10 @@
2525

2626
package org.graalvm.visualvm.heapviewer;
2727

28-
import java.awt.event.ActionEvent;
29-
import java.awt.event.ActionListener;
3028
import java.io.File;
3129
import java.io.IOException;
3230
import java.util.List;
33-
import javax.swing.Timer;
3431
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
35-
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
36-
import org.netbeans.api.progress.ProgressHandle;
3732
import org.openide.util.Lookup;
3833

3934
/**
@@ -65,25 +60,6 @@ public HeapFragment(String id, String name, String description, Heap heap) {
6560

6661
public Heap getHeap() { return heap; }
6762

68-
69-
public static void setProgress(final ProgressHandle pHandle, final int offset) {
70-
final long progressId = HeapProgress.getProgressId();
71-
final Timer[] timer = new Timer[1];
72-
73-
timer[0] = new Timer(1500, new ActionListener() {
74-
public void actionPerformed(ActionEvent e) {
75-
int value = HeapProgress.getProgressValue(progressId);
76-
if (value>=0) {
77-
pHandle.progress(value + offset);
78-
} else {
79-
timer[0].stop();
80-
}
81-
}
82-
});
83-
timer[0].start();
84-
}
85-
86-
8763
public static abstract class Provider {
8864

8965
public abstract List<HeapFragment> getFragments(File heapDumpFile, Lookup.Provider heapDumpProject, Heap heap) throws IOException;

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapViewer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
import javax.swing.SwingUtilities;
3636
import org.graalvm.visualvm.core.ui.components.NotSupportedDisplayer;
3737
import org.graalvm.visualvm.heapviewer.ui.HeapViewerComponent;
38+
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
3839
import org.graalvm.visualvm.heapviewer.utils.HeapUtils;
3940
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
4041
import org.graalvm.visualvm.lib.jfluid.heap.HeapFactory;
4142
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
42-
import org.netbeans.api.progress.ProgressHandle;
4343
import org.openide.util.Lookup;
4444
import org.openide.util.NbBundle;
4545

@@ -111,17 +111,17 @@ public void closed() {
111111
private static Heap createHeap(File heapFile) throws IOException {
112112
assert !SwingUtilities.isEventDispatchThread();
113113

114-
ProgressHandle pHandle = null;
114+
HeapOperations.OpProgressHandle pHandle = null;
115115

116116
try {
117-
pHandle = ProgressHandle.createHandle(Bundle.HeapViewer_LoadingDumpMsg());
117+
pHandle = new HeapOperations.OpProgressHandle(Bundle.HeapViewer_LoadingDumpMsg());
118118
pHandle.setInitialDelay(1000);
119119
pHandle.start(HeapProgress.PROGRESS_MAX*2);
120120

121-
HeapFragment.setProgress(pHandle, 0);
121+
pHandle.setProgress(0);
122122
Heap heap = HeapFactory.createHeap(heapFile);
123123

124-
HeapFragment.setProgress(pHandle, HeapProgress.PROGRESS_MAX);
124+
pHandle.setProgress(HeapProgress.PROGRESS_MAX);
125125
heap.getSummary(); // Precompute HeapSummary within the progress
126126

127127
return heap;

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.util.WeakHashMap;
3232
import javax.swing.SwingUtilities;
3333
import javax.swing.Timer;
34-
import org.graalvm.visualvm.heapviewer.HeapFragment;
3534
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3635
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
3736
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
@@ -97,14 +96,14 @@ private void initializeReferencesImpl(Heap heap) throws InterruptedException {
9796
if (referencesComputer == null) {
9897
Runnable workerR = new Runnable() {
9998
public void run() {
100-
ProgressHandle pHandle = null;
99+
OpProgressHandle pHandle = null;
101100

102101
try {
103-
pHandle = ProgressHandle.createHandle(Bundle.HeapOperations_ComputingReferences());
102+
pHandle = new OpProgressHandle(Bundle.HeapOperations_ComputingReferences());
104103
pHandle.setInitialDelay(1000);
105104
pHandle.start(HeapProgress.PROGRESS_MAX);
106105

107-
HeapFragment.setProgress(pHandle, 0);
106+
pHandle.setProgress(0);
108107

109108
Instance dummy = heap.getAllInstancesIterator().next();
110109
dummy.getReferences();
@@ -147,14 +146,14 @@ private void initializeGCRootsImpl(Heap heap) throws InterruptedException {
147146
if (gcrootsComputer == null) {
148147
Runnable workerR = new Runnable() {
149148
public void run() {
150-
ProgressHandle pHandle = null;
149+
OpProgressHandle pHandle = null;
151150

152151
try {
153-
pHandle = ProgressHandle.createHandle(Bundle.HeapOperations_ComputingGCRoots());
152+
pHandle = new OpProgressHandle(Bundle.HeapOperations_ComputingGCRoots());
154153
pHandle.setInitialDelay(1000);
155154
pHandle.start(HeapProgress.PROGRESS_MAX);
156155

157-
HeapFragment.setProgress(pHandle, 0);
156+
pHandle.setProgress(0);
158157

159158
Instance dummy = heap.getAllInstancesIterator().next();
160159
dummy.getNearestGCRootPointer();
@@ -196,19 +195,19 @@ private void initializeRetainedSizesImpl(Heap heap) throws InterruptedException
196195
if (retainedComputer == null) {
197196
Runnable workerR = new Runnable() {
198197
public void run() {
199-
ProgressHandle pHandle = null;
198+
OpProgressHandle pHandle = null;
200199

201200
try {
202-
pHandle = ProgressHandle.createHandle(Bundle.HeapOperations_ComputingRetainedSizes());
201+
pHandle = new OpProgressHandle(Bundle.HeapOperations_ComputingRetainedSizes());
203202
pHandle.setInitialDelay(1000);
204203
pHandle.start();
205204

206-
setRetainedSizesProgress(pHandle, HeapProgress.PROGRESS_MAX, 3*HeapProgress.PROGRESS_MAX);
205+
pHandle.setRetainedSizesProgress(HeapProgress.PROGRESS_MAX, 3*HeapProgress.PROGRESS_MAX);
207206

208207
Instance dummy = heap.getAllInstancesIterator().next();
209208
dummy.getRetainedSize();
210209

211-
HeapFragment.setProgress(pHandle, 2*HeapProgress.PROGRESS_MAX);
210+
pHandle.setProgress(2*HeapProgress.PROGRESS_MAX);
212211

213212
List<JavaClass> classes = heap.getAllClasses();
214213
if (!classes.isEmpty()) classes.get(0).getRetainedSizeByClass();
@@ -234,25 +233,69 @@ public void run() {
234233
_retainedComputer.waitFinished(0);
235234
}
236235

237-
private static void setRetainedSizesProgress(final ProgressHandle pHandle, final int offset, final int workunits) {
238-
final long progressId = HeapProgress.getProgressId();
239-
final Timer timer[] = new Timer[1];
236+
public static class OpProgressHandle {
240237

241-
timer[0] = new Timer(1500, new ActionListener() {
242-
boolean switchedToDeterminate;
243-
public void actionPerformed(ActionEvent e) {
244-
if (!switchedToDeterminate) {
245-
pHandle.switchToDeterminate(workunits);
246-
switchedToDeterminate = true;
238+
private final ProgressHandle handle;
239+
private Timer timer;
240+
241+
public OpProgressHandle(String displayName) {
242+
handle = ProgressHandle.createHandle(displayName);
243+
}
244+
245+
public void setInitialDelay(int millis) {
246+
handle.setInitialDelay(millis);
247+
}
248+
249+
public void start() {
250+
handle.start();
251+
}
252+
253+
public void start(int workunits) {
254+
handle.start(workunits);
255+
}
256+
257+
public void setProgress(final int offset) {
258+
final long progressId = HeapProgress.getProgressId();
259+
260+
if (timer != null) timer.stop();
261+
timer = new Timer(1500, new ActionListener() {
262+
public void actionPerformed(ActionEvent e) {
263+
int value = HeapProgress.getProgressValue(progressId);
264+
if (value >= 0) {
265+
handle.progress(value + offset);
266+
} else {
267+
timer.stop();
268+
}
247269
}
248-
int value = HeapProgress.getProgressValue(progressId);
249-
if (value>=0) {
250-
pHandle.progress(value + offset);
251-
} else {
252-
timer[0].stop();
270+
});
271+
timer.start();
272+
}
273+
274+
private void setRetainedSizesProgress(final int offset, final int workunits) {
275+
final long progressId = HeapProgress.getProgressId();
276+
277+
timer = new Timer(1500, new ActionListener() {
278+
boolean switchedToDeterminate;
279+
280+
public void actionPerformed(ActionEvent e) {
281+
if (!switchedToDeterminate) {
282+
handle.switchToDeterminate(workunits);
283+
switchedToDeterminate = true;
284+
}
285+
int value = HeapProgress.getProgressValue(progressId);
286+
if (value >= 0) {
287+
handle.progress(value + offset);
288+
} else {
289+
timer.stop();
290+
}
253291
}
254-
}
255-
});
256-
timer[0].start();
292+
});
293+
timer.start();
294+
}
295+
296+
public void finish() {
297+
if (timer != null) timer.stop();
298+
handle.finish();
299+
}
257300
}
258301
}

0 commit comments

Comments
 (0)