tmf: Bug 494952: Remove deadlock in Time Chart view
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / views / timechart / TimeChartView.java
index 571c19840f9b28c91457538789c15da04ecc7bd6..28a198ed714d7b8a1f129b92c51b882066cd7220 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Ericsson
+ * Copyright (c) 2010, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -30,6 +30,7 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.resources.ITmfMarker;
 import org.eclipse.tracecompass.tmf.core.signal.TmfEventFilterAppliedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfEventSearchAppliedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
@@ -81,6 +82,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
     private final List<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<>();
     private final Map<ITmfTrace, TimeChartDecorationProvider> fDecorationProviders = new HashMap<>();
     private final List<DecorateThread> fDecorateThreads = new ArrayList<>();
+    private final Map<ITmfTrace, ProcessTraceThread> fProcessTraceThreads = new HashMap<>();
     private long fStartTime = 0;
     private long fStopTime = Long.MAX_VALUE;
     private boolean fRefreshBusy = false;
@@ -119,8 +121,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
             TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
             fTimeAnalysisEntries.add(timeAnalysisEntry);
             fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
-            Thread thread = new ProcessTraceThread(timeAnalysisEntry);
-            thread.start();
+            startProcessTraceThread(timeAnalysisEntry);
         }
         fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
 
@@ -131,8 +132,10 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
     @Override
     public void dispose() {
         ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-        for (DecorateThread thread : fDecorateThreads) {
-            thread.cancel();
+        synchronized (fDecorateThreads) {
+            for (DecorateThread thread : fDecorateThreads) {
+                thread.cancel();
+            }
         }
         ColorSettingsManager.removeColorSettingsListener(this);
         super.dispose();
@@ -143,22 +146,50 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
         fViewer.setFocus();
     }
 
+    private void startProcessTraceThread(TimeChartAnalysisEntry entry) {
+        synchronized (fProcessTraceThreads) {
+            ProcessTraceThread thread = fProcessTraceThreads.get(entry.getTrace());
+            if (thread != null) {
+                thread.restart();
+            } else {
+                thread = new ProcessTraceThread(entry);
+                fProcessTraceThreads.put(entry.getTrace(), thread);
+                thread.start();
+            }
+        }
+    }
+
     private class ProcessTraceThread extends Thread {
 
         private final TimeChartAnalysisEntry fTimeAnalysisEntry;
+        private boolean fRestart;
 
         public ProcessTraceThread(TimeChartAnalysisEntry timeAnalysisEntry) {
             super("ProcessTraceJob:" + timeAnalysisEntry.getName()); //$NON-NLS-1$
             fTimeAnalysisEntry = timeAnalysisEntry;
         }
 
+        public void restart() {
+            synchronized (fProcessTraceThreads) {
+                fRestart = true;
+            }
+        }
+
         @Override
         public void run() {
-            TmfTimeRange range = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
-
-            updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE,
-                    range.getStartTime().toNanos(),
-                    range.getEndTime().toNanos());
+            while (true) {
+                updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE,
+                        TmfTimestamp.BIG_BANG.toNanos(),
+                        TmfTimestamp.BIG_CRUNCH.toNanos());
+                synchronized (fProcessTraceThreads) {
+                    if (fRestart) {
+                        fRestart = false;
+                    } else {
+                        fProcessTraceThreads.remove(fTimeAnalysisEntry.getTrace());
+                        return;
+                    }
+                }
+            }
         }
     }
 
@@ -239,7 +270,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                     return;
                 }
                 fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
-                fViewer.resetStartFinishTime();
+                fViewer.resetStartFinishTime(false);
                 synchronized (fSyncObj) {
                     fRefreshBusy = false;
                     if (fRefreshPending) {
@@ -561,9 +592,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
         for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {
             for (TimeChartDecorationProvider provider : fDecorationProviders.values()) {
                 if (delta.getResource().equals(provider.getBookmarksFile())) {
-                    if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) {
-                        provider.refreshBookmarks();
-                    } else if (delta.getKind() == IResourceDelta.REMOVED) {
+                    if (delta.getKind() == IResourceDelta.REMOVED ||
+                            delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1 ||
+                            delta.getMarker().getAttribute(ITmfMarker.MARKER_RANK, (String) null) != null) {
                         provider.refreshBookmarks();
                     }
                 }
@@ -597,8 +628,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
             timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
             fTimeAnalysisEntries.add(timeAnalysisEntry);
             fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
-            Thread thread = new ProcessTraceThread(timeAnalysisEntry);
-            thread.start();
+            startProcessTraceThread(timeAnalysisEntry);
         }
         refreshViewer();
     }
@@ -666,7 +696,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
         for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
             TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);
             if (timeAnalysisEntry.getTrace().equals(trace)) {
-                updateTraceEntry(timeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);
+                startProcessTraceThread(timeAnalysisEntry);
                 break;
             }
         }
This page took 0.031936 seconds and 5 git commands to generate.