[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);
 	}