timing: Listener on table viewer should not be mandatory
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Thu, 20 Apr 2017 17:06:30 +0000 (13:06 -0400)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Mon, 8 May 2017 21:44:56 +0000 (17:44 -0400)
Race conditions can happen in views where there is a segment store table
and another viewer (like density view) where the data is updated twice
in the table, one by the table viewer itself and one by the density
viewer.

Now the density views can specify not to add a listener for the table
and let the density viewer update the data.

Change-Id: I1d12560bf6dd5f43a667be5836176b4af6f897bc
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/95406
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Hudson CI
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/latency/SystemCallLatencyDensityView.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/table/AbstractSegmentStoreTableViewer.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/table/SegmentStoreTableViewer.java

index 8299fc71ea048864df5a798c6a66f6aa0abc165e..5a89950e1e2d4e3219b8d22c5426e2911d222510 100644 (file)
@@ -39,7 +39,7 @@ public class SystemCallLatencyDensityView extends AbstractSegmentStoreDensityVie
 
     @Override
     protected AbstractSegmentStoreTableViewer createSegmentStoreTableViewer(Composite parent) {
-        return new SegmentStoreTableViewer(new TableViewer(parent, SWT.FULL_SELECTION | SWT.VIRTUAL), SystemCallLatencyAnalysis.ID) {
+        return new SegmentStoreTableViewer(new TableViewer(parent, SWT.FULL_SELECTION | SWT.VIRTUAL), SystemCallLatencyAnalysis.ID, false) {
             @Override
             protected void createProviderColumns() {
                 super.createProviderColumns();
index 75df3d42dbf15ab1bd1a71854c2d57472cfa0249..060173f3b4a9eed612cec163ec405948574eeecd 100644 (file)
@@ -126,7 +126,7 @@ public abstract class AbstractSegmentStoreTableViewer extends TmfSimpleTableView
     /**
      * provider progress listener
      */
-    private SegmentStoreProviderProgressListener fListener;
+    private final @Nullable SegmentStoreProviderProgressListener fListener;
 
     /**
      * Flag to create columns once
@@ -144,13 +144,29 @@ public abstract class AbstractSegmentStoreTableViewer extends TmfSimpleTableView
      *            Table viewer of the view
      */
     public AbstractSegmentStoreTableViewer(TableViewer tableViewer) {
+        this(tableViewer, true);
+    }
+
+    /**
+     * Constructor
+     *
+     * @param tableViewer
+     *            Table viewer of the view
+     * @param withListener
+     *            Whether to add a listener to this table viewer. For instance,
+     *            for table viewers who are part of another view who update the
+     *            table's data, this value can be <code>false</code> so only the
+     *            other listeners will update the data
+     * @since 1.4
+     */
+    public AbstractSegmentStoreTableViewer(TableViewer tableViewer, boolean withListener) {
         super(tableViewer);
         // Sort order of the content provider is by start time by default
         getTableViewer().setContentProvider(new SegmentStoreContentProvider());
         createColumns();
         getTableViewer().getTable().addSelectionListener(new TableSelectionListener());
         addPackListener();
-        fListener = new SegmentStoreProviderProgressListener();
+        fListener = withListener ? new SegmentStoreProviderProgressListener() : null;
     }
 
     // ------------------------------------------------------------------------
@@ -179,7 +195,6 @@ public abstract class AbstractSegmentStoreTableViewer extends TmfSimpleTableView
         createProviderColumns();
         getTableViewer().getTable().addSelectionListener(new TableSelectionListener());
         addPackListener();
-        fListener = new SegmentStoreProviderProgressListener();
         table.setRedraw(true);
     }
 
@@ -287,7 +302,10 @@ public abstract class AbstractSegmentStoreTableViewer extends TmfSimpleTableView
         // If results are null, then add completion listener and if the provider
         // is an analysis, run the analysis
         updateModel(null);
-        provider.addListener(fListener);
+        SegmentStoreProviderProgressListener listener = fListener;
+        if (listener != null) {
+            provider.addListener(listener);
+        }
         if (provider instanceof IAnalysisModule) {
             ((IAnalysisModule) provider).schedule();
         }
@@ -390,7 +408,10 @@ public abstract class AbstractSegmentStoreTableViewer extends TmfSimpleTableView
 
             ISegmentStoreProvider provider = getSegmentProvider();
             if ((provider != null)) {
-                provider.removeListener(fListener);
+                SegmentStoreProviderProgressListener listener = fListener;
+                if (listener != null) {
+                    provider.removeListener(listener);
+                }
             }
         }
     }
index fd8e093f6b91485053e80c9099f2f5dc783a458f..f918db74f50aa02b1586497789470dca51878a07 100644 (file)
@@ -38,7 +38,26 @@ public class SegmentStoreTableViewer extends AbstractSegmentStoreTableViewer {
      *            The ID of the analysis this viewer is for
      */
     public SegmentStoreTableViewer(TableViewer tableViewer, String analysisId) {
-        super(tableViewer);
+        super(tableViewer, true);
+        fAnalysisId = analysisId;
+    }
+
+    /**
+     * Constructor
+     *
+     * @param tableViewer
+     *            Table viewer of the view
+     * @param analysisId
+     *            The ID of the analysis this viewer is for
+     * @param withListener
+     *            Whether to add a listener to this table viewer. For instance,
+     *            for table viewers who are part of another view who update the
+     *            table's data, this value can be <code>false</code> so only the
+     *            other listeners will update the data
+     * @since 1.4
+     */
+    public SegmentStoreTableViewer(TableViewer tableViewer, String analysisId, boolean withListener) {
+        super(tableViewer, withListener);
         fAnalysisId = analysisId;
     }
 
This page took 0.029747 seconds and 5 git commands to generate.