Skip to content

Commit 11b51d9

Browse files
committed
GH-406 new API for head-less progress
1 parent 0dba3ea commit 11b51d9

File tree

5 files changed

+57
-38
lines changed

5 files changed

+57
-38
lines changed

visualvm/heapviewer/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<build-prerequisite/>
3030
<compile-dependency/>
3131
<run-dependency>
32-
<specification-version>1.1</specification-version>
32+
<specification-version>1.2</specification-version>
3333
</run-dependency>
3434
</dependency>
3535
<dependency>

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525

2626
package org.graalvm.visualvm.heapviewer;
2727

28+
import java.awt.event.ActionEvent;
29+
import java.awt.event.ActionListener;
2830
import java.io.File;
2931
import java.io.IOException;
3032
import java.util.List;
31-
import javax.swing.BoundedRangeModel;
32-
import javax.swing.event.ChangeEvent;
33-
import javax.swing.event.ChangeListener;
33+
import javax.swing.Timer;
3434
import org.netbeans.api.progress.ProgressHandle;
3535
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3636
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
@@ -67,12 +67,20 @@ public HeapFragment(String id, String name, String description, Heap heap) {
6767

6868

6969
public static void setProgress(final ProgressHandle pHandle, final int offset) {
70-
final BoundedRangeModel progress = HeapProgress.getProgress();
71-
progress.addChangeListener(new ChangeListener() {
72-
public void stateChanged(ChangeEvent e) {
73-
pHandle.progress(progress.getValue() + 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+
}
7481
}
7582
});
83+
timer[0].start();
7684
}
7785

7886

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

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

27+
import java.awt.event.ActionEvent;
28+
import java.awt.event.ActionListener;
2729
import java.util.List;
2830
import java.util.Map;
2931
import java.util.WeakHashMap;
30-
import javax.swing.BoundedRangeModel;
3132
import javax.swing.SwingUtilities;
32-
import javax.swing.event.ChangeEvent;
33-
import javax.swing.event.ChangeListener;
33+
import javax.swing.Timer;
3434
import org.graalvm.visualvm.heapviewer.HeapFragment;
3535
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3636
import org.graalvm.visualvm.lib.jfluid.heap.HeapProgress;
@@ -235,18 +235,24 @@ public void run() {
235235
}
236236

237237
private static void setRetainedSizesProgress(final ProgressHandle pHandle, final int offset, final int workunits) {
238-
final BoundedRangeModel progress = HeapProgress.getProgress();
239-
progress.addChangeListener(new ChangeListener() {
240-
boolean switchedToDeterminate;
238+
final long progressId = HeapProgress.getProgressId();
239+
final Timer timer[] = new Timer[1];
241240

242-
@Override
243-
public void stateChanged(ChangeEvent e) {
241+
timer[0] = new Timer(1500, new ActionListener() {
242+
boolean switchedToDeterminate;
243+
public void actionPerformed(ActionEvent e) {
244244
if (!switchedToDeterminate) {
245245
pHandle.switchToDeterminate(workunits);
246246
switchedToDeterminate = true;
247247
}
248-
pHandle.progress(progress.getValue() + offset);
248+
int value = HeapProgress.getProgressValue(progressId);
249+
if (value>=0) {
250+
pHandle.progress(value + offset);
251+
} else {
252+
timer[0].stop();
253+
}
249254
}
250255
});
256+
timer[0].start();
251257
}
252258
}
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.jfluid.heap
33
OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/jfluid/heap/Bundle.properties
4-
OpenIDE-Module-Specification-Version: 1.1
4+
OpenIDE-Module-Specification-Version: 1.2
55

visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HeapProgress.java

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525

2626
package org.graalvm.visualvm.lib.jfluid.heap;
2727

28-
import javax.swing.BoundedRangeModel;
29-
import javax.swing.DefaultBoundedRangeModel;
30-
import javax.swing.SwingUtilities;
28+
import java.util.Collections;
29+
import java.util.HashMap;
30+
import java.util.Map;
31+
import java.util.concurrent.atomic.AtomicLong;
3132

3233

3334
/**
@@ -37,20 +38,30 @@ public final class HeapProgress {
3738

3839
public static final int PROGRESS_MAX = 1000;
3940
private static ThreadLocal<ModelInfo> progressThreadLocal = new ThreadLocal();
41+
private static Map<Long,ModelInfo> progresses = Collections.synchronizedMap(new HashMap<>());
4042

4143
private HeapProgress() {
4244
}
4345

44-
public static BoundedRangeModel getProgress() {
46+
public static long getProgressId() {
4547
ModelInfo info = progressThreadLocal.get();
4648

4749
if (info == null) {
4850
info = new ModelInfo();
4951
progressThreadLocal.set(info);
52+
progresses.put(info.progressId, info);
5053
}
51-
return info.model;
54+
return info.progressId;
5255
}
5356

57+
public static int getProgressValue(long progressId) {
58+
ModelInfo info = progresses.get(progressId);
59+
if (info != null) {
60+
return info.value;
61+
}
62+
return -1;
63+
}
64+
5465
static void progress(long counter, long startOffset, long value, long endOffset) {
5566
// keep this method short so that it can be inlined
5667
if (counter % 100000 == 0) {
@@ -70,7 +81,7 @@ private static void progress(final long value, final long endOffset, final long
7081
}
7182
long val = PROGRESS_MAX*(value - startOffset)/(endOffset - startOffset);
7283
int modelVal = (int) (info.offset + val/info.divider);
73-
setValue(info.model, modelVal);
84+
info.value = modelVal;
7485
}
7586
}
7687

@@ -94,29 +105,23 @@ static void progressFinish() {
94105
assert level >= 0;
95106
if (level == 0) {
96107
progressThreadLocal.remove();
108+
progresses.remove(info.progressId);
97109
}
98-
info.offset = info.model.getValue();
99-
}
100-
}
101-
102-
private static void setValue(final BoundedRangeModel model, final int val) {
103-
if (SwingUtilities.isEventDispatchThread()) {
104-
model.setValue(val);
105-
} else {
106-
SwingUtilities.invokeLater(new Runnable() {
107-
public void run() { model.setValue(val); }
108-
});
110+
info.offset = info.value;
109111
}
110112
}
111113

112114
private static class ModelInfo {
113-
private BoundedRangeModel model;
115+
private static final AtomicLong PROGRESS_ID = new AtomicLong(0);
116+
117+
private final long progressId;
114118
private int level;
115119
private int divider;
116120
private int offset;
121+
private int value;
117122

118123
private ModelInfo() {
119-
model = new DefaultBoundedRangeModel(0,0,0,PROGRESS_MAX);
120-
}
124+
progressId = PROGRESS_ID.incrementAndGet();
125+
}
121126
}
122127
}

0 commit comments

Comments
 (0)