[R-DataEditor] Fix notification of FilterSet post listeners
Follow-up-to: 315e3876ce94392e0a52cee0a0276d987a41a1bf
Change-Id: Ia564e769c0ce528dfb320b7d1780c09623052972
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/datafilter/FilterSet.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/datafilter/FilterSet.java
index 972f8db..61b9ef9 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/datafilter/FilterSet.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/datafilter/FilterSet.java
@@ -50,7 +50,7 @@
public class FilterSet {
- private final static int POST_DELAY= 400;
+ private final static int POST_DELAY_NANOS= 200 * 1_000_000;
private final static int STD_DELAY= 1;
private final static int NO_DELAY= 2;
@@ -111,7 +111,8 @@
private final CopyOnWriteIdentityListSet<FilterListener> listeners= new CopyOnWriteIdentityListSet<>();
private final CopyOnWriteIdentityListSet<FilterListener> postListeners= new CopyOnWriteIdentityListSet<>();
- private volatile int listenerScheduled;
+ private int listenerScheduled;
+ private long listenerEventStamp;
private final Runnable listenerRunnable= this::updateWithinRealm;
private final ScheduledRealmRunnable postListenerRunnable;
@@ -417,14 +418,21 @@
}
private void updateWithinRealm() {
- final long stamp= System.nanoTime();
- final int schedule= this.listenerScheduled;
- this.listenerScheduled= 0;
+ final long stamp;
+ final int schedule;
+ synchronized (this.listenerRunnable) {
+ schedule= this.listenerScheduled;
+ this.listenerScheduled= 0;
+ stamp= this.listenerEventStamp;
+ }
+ if (schedule == 0) {
+ return;
+ }
notifyListeners();
if (schedule != NO_DELAY) {
- this.postListenerRunnable.scheduleFor(stamp + POST_DELAY);
+ this.postListenerRunnable.scheduleFor(stamp + POST_DELAY_NANOS);
}
else {
this.postListenerRunnable.runNow();
@@ -512,11 +520,14 @@
}
private void notifyListeners(final int mode) {
- final int schedule= this.listenerScheduled;
- if (schedule >= mode) {
- return;
+ synchronized (this.listenerRunnable) {
+ final int schedule= this.listenerScheduled;
+ if (schedule >= mode) {
+ return;
+ }
+ this.listenerScheduled= mode;
+ this.listenerEventStamp= System.nanoTime();
}
- this.listenerScheduled= mode;
runInRealm(this.listenerRunnable);
}