tmf: Bug 468867: Time graph listener notifier interference from ext sync
authorPatrick Tasse <patrick.tasse@gmail.com>
Fri, 29 May 2015 20:37:20 +0000 (16:37 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Mon, 15 Jun 2015 13:41:39 +0000 (09:41 -0400)
Change-Id: I2099016a56c4a13ce1661c6a84d8168486be15a0
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/50146
Reviewed-by: Hudson CI
Reviewed-by: Alexandre Montplaisir <alexmonthy@voxpopuli.im>
Tested-by: Alexandre Montplaisir <alexmonthy@voxpopuli.im>
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphViewer.java
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/ITimeDataProvider.java
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphScale.java

index 7e1ec6cc1c1d7016496522df4d8bd05475387032..bd6fed84756ac9af394e212ffe437d246cfc67ea 100644 (file)
@@ -136,7 +136,6 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
     private Action fFollowArrowBwdAction;
 
     private ListenerNotifier fListenerNotifier;
-    private final Object fListenerNotifierLock = new Object();
 
     private Composite fTimeAlignedComposite;
 
@@ -157,28 +156,27 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
                     return;
                 }
             }
-            synchronized (fListenerNotifierLock) {
-                fListenerNotifier = null;
-            }
-            if (!isInterrupted()) {
-                Display.getDefault().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (fDataViewer.isDisposed()) {
-                            return;
-                        }
-                        if (fSelectionChanged) {
-                            fireSelectionChanged(fSelectedEntry);
-                        }
-                        if (fTimeRangeUpdated) {
-                            fireTimeRangeUpdated(fTime0, fTime1);
-                        }
-                        if (fTimeSelected) {
-                            fireTimeSelected(fSelectionBegin, fSelectionEnd);
-                        }
+            Display.getDefault().asyncExec(new Runnable() {
+                @Override
+                public void run() {
+                    if (fListenerNotifier != ListenerNotifier.this) {
+                        return;
                     }
-                });
-            }
+                    fListenerNotifier = null;
+                    if (ListenerNotifier.this.isInterrupted() || fDataViewer.isDisposed()) {
+                        return;
+                    }
+                    if (fSelectionChanged) {
+                        fireSelectionChanged(fSelectedEntry);
+                    }
+                    if (fTimeRangeUpdated) {
+                        fireTimeRangeUpdated(fTime0, fTime1);
+                    }
+                    if (fTimeSelected) {
+                        fireTimeSelected(fSelectionBegin, fSelectionEnd);
+                    }
+                }
+            });
         }
 
         public void selectionChanged() {
@@ -195,6 +193,18 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
             fTimeSelected = true;
             fLastUpdateTime = System.currentTimeMillis();
         }
+
+        public boolean hasSelectionChanged() {
+            return fSelectionChanged;
+        }
+
+        public boolean hasTimeRangeUpdated() {
+            return fTimeRangeUpdated;
+        }
+
+        public boolean hasTimeSelected() {
+            return fTimeSelected;
+        }
     }
 
     /**
@@ -254,7 +264,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
     public void setInput(Object inputElement) {
         fInputElement = inputElement;
         ITimeGraphEntry[] input = fTimeGraphContentProvider.getElements(inputElement);
-
+        fListenerNotifier = null;
         if (fTimeGraphCtrl != null) {
             setTimeRange(input);
             setTopIndex(0);
@@ -729,7 +739,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
 
     @Override
     public void setStartFinishTimeNotify(long time0, long time1) {
-        setStartFinishTime(time0, time1);
+        setStartFinishTimeInt(time0, time1);
         notifyRangeListeners();
     }
 
@@ -740,6 +750,14 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
 
     @Override
     public void setStartFinishTime(long time0, long time1) {
+        /* if there is a pending time range, ignore this one */
+        if (fListenerNotifier != null && fListenerNotifier.hasTimeRangeUpdated()) {
+            return;
+        }
+        setStartFinishTimeInt(time0, time1);
+    }
+
+    private void setStartFinishTimeInt(long time0, long time1) {
         fTime0 = time0;
         if (fTime0 < fTime0Bound) {
             fTime0 = fTime0Bound;
@@ -765,7 +783,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
 
     @Override
     public void resetStartFinishTime() {
-        setStartFinishTime(fTime0Bound, fTime1Bound);
+        setStartFinishTimeNotify(fTime0Bound, fTime1Bound);
         fTimeRangeFixed = false;
     }
 
@@ -776,6 +794,10 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
 
     @Override
     public void setSelectedTime(long time, boolean ensureVisible) {
+        /* if there is a pending time selection, ignore this one */
+        if (fListenerNotifier != null && fListenerNotifier.hasTimeSelected()) {
+            return;
+        }
         setSelectedTimeInt(time, ensureVisible, false);
     }
 
@@ -799,6 +821,10 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
 
     @Override
     public void setSelectionRange(long beginTime, long endTime) {
+        /* if there is a pending time selection, ignore this one */
+        if (fListenerNotifier != null && fListenerNotifier.hasTimeSelected()) {
+            return;
+        }
         fSelectionBegin = Math.max(fTime0Bound, Math.min(fTime1Bound, beginTime));
         fSelectionEnd = Math.max(fTime0Bound, Math.min(fTime1Bound, endTime));
         fTimeGraphCtrl.redraw();
@@ -957,13 +983,11 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
     }
 
     private void notifySelectionListeners() {
-        synchronized (fListenerNotifierLock) {
-            if (fListenerNotifier == null) {
-                fListenerNotifier = new ListenerNotifier();
-                fListenerNotifier.start();
-            }
-            fListenerNotifier.selectionChanged();
+        if (fListenerNotifier == null) {
+            fListenerNotifier = new ListenerNotifier();
+            fListenerNotifier.start();
         }
+        fListenerNotifier.selectionChanged();
     }
 
     private void fireSelectionChanged(ITimeGraphEntry selection) {
@@ -995,13 +1019,11 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
     }
 
     private void notifyTimeListeners() {
-        synchronized (fListenerNotifierLock) {
-            if (fListenerNotifier == null) {
-                fListenerNotifier = new ListenerNotifier();
-                fListenerNotifier.start();
-            }
-            fListenerNotifier.timeSelected();
+        if (fListenerNotifier == null) {
+            fListenerNotifier = new ListenerNotifier();
+            fListenerNotifier.start();
         }
+        fListenerNotifier.timeSelected();
     }
 
     private void fireTimeSelected(long startTime, long endTime) {
@@ -1033,13 +1055,11 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
     }
 
     private void notifyRangeListeners() {
-        synchronized (fListenerNotifierLock) {
-            if (fListenerNotifier == null) {
-                fListenerNotifier = new ListenerNotifier();
-                fListenerNotifier.start();
-            }
-            fListenerNotifier.timeRangeUpdated();
+        if (fListenerNotifier == null) {
+            fListenerNotifier = new ListenerNotifier();
+            fListenerNotifier.start();
         }
+        fListenerNotifier.timeRangeUpdated();
     }
 
     private void fireTimeRangeUpdated(long startTime, long endTime) {
@@ -1103,6 +1123,10 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
      *            The trace that was selected
      */
     public void setSelection(ITimeGraphEntry trace) {
+        /* if there is a pending selection, ignore this one */
+        if (fListenerNotifier != null && fListenerNotifier.hasSelectionChanged()) {
+            return;
+        }
         fSelectedEntry = trace;
         fTimeGraphCtrl.selectItem(trace, false);
         adjustVerticalScrollBar();
@@ -1123,7 +1147,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
             return;
         }
 
-        setStartFinishTime(time0, time1);
+        setStartFinishTimeInt(time0, time1);
 
         // update notification time values since we are now in synch with the
         // external application
@@ -1509,7 +1533,6 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
                 @Override
                 public void run() {
                     resetStartFinishTime();
-                    notifyStartFinishTime();
                 }
             };
             fResetScaleAction.setText(Messages.TmfTimeGraphViewer_ResetScaleActionNameText);
index f99459eabc0e19b5a191fbe82f734de8a47a270f..b6b170fbd02bf62964964e31a29d659a7d6da5d2 100644 (file)
@@ -142,7 +142,7 @@ public interface ITimeDataProvider {
     void setSelectedTime(long time, boolean ensureVisible);
 
     /**
-     * Reset the start and end times
+     * Reset the start and end times and notify the registered listeners
      */
     void resetStartFinishTime();
 
index 256327c04ec75ec6805d6578d12eed4518b380e4..136105c39c57bd5300dbc239ebb238d015486ea1 100644 (file)
@@ -2060,7 +2060,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
                     time0 = fTimeProvider.getMinTime();
                     time1 = time0 + (fTime1bak - fTime0bak);
                 }
-                fTimeProvider.setStartFinishTime(time0, time1);
+                fTimeProvider.setStartFinishTimeNotify(time0, time1);
             }
         } else if (DRAG_SPLIT_LINE == fDragState) {
             fDragX = e.x;
index c56a8573a7b43e4b520b8afe8aa276f9c8f9d825..d625ed854974c3b27c30a1a7a2b3cf8cb0a06901 100644 (file)
@@ -571,10 +571,10 @@ public class TimeGraphScale extends TimeGraphBaseControl implements
                 }
                 long interval = (long) ((fTime1bak - fTime0bak) * ((double) fDragX0 / fDragX));
                 if (interval == Long.MAX_VALUE) {
-                    fTimeProvider.setStartFinishTime(fTime0bak, Long.MAX_VALUE);
+                    fTimeProvider.setStartFinishTimeNotify(fTime0bak, Long.MAX_VALUE);
                 } else {
                     long time1 = fTime0bak + (long) ((fTime1bak - fTime0bak) * ((double) fDragX0 / fDragX));
-                    fTimeProvider.setStartFinishTime(fTime0bak, time1);
+                    fTimeProvider.setStartFinishTimeNotify(fTime0bak, time1);
                 }
             }
         }
@@ -584,7 +584,6 @@ public class TimeGraphScale extends TimeGraphBaseControl implements
     public void mouseDoubleClick(MouseEvent e) {
         if (e.button == 1 && null != fTimeProvider && fTimeProvider.getTime0() != fTimeProvider.getTime1() && (e.stateMask & SWT.BUTTON_MASK) == 0) {
             fTimeProvider.resetStartFinishTime();
-            fTimeProvider.notifyStartFinishTime();
             fTime0bak = fTimeProvider.getTime0();
             fTime1bak = fTimeProvider.getTime1();
         }
This page took 0.048895 seconds and 5 git commands to generate.