tmf: make latches synchronized in abstract analysis module [bug 485793]
authorMatthew Khouzam <matthew.khouzam@ericsson.com>
Mon, 24 Oct 2016 13:47:55 +0000 (09:47 -0400)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Mon, 24 Oct 2016 19:52:45 +0000 (15:52 -0400)
Fixes a build instability caused by schedule (by design) spawning a job
that runs asynchronously. This makes cancellation racy since it can occur
before said job starts.

Change-Id: I93617efb80f4eb196ef0aba5cbe72e67917c876c
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/83786
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Reviewed-by: Hudson CI
Tested-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisModuleTest.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAbstractAnalysisModule.java

index 35001d5e87e2ca2b5935860a6fddd8c365148f0a..1243682b80e6d6ae688ae2836c67a8c1650a3c9d 100644 (file)
@@ -234,7 +234,8 @@ public class AnalysisModuleTest {
             fail(e.getMessage());
         }
 
-        assertEquals(Status.OK_STATUS, module.schedule());
+        IStatus schedule = module.schedule();
+        assertEquals(Status.OK_STATUS, schedule);
 
         /* Give the job a chance to start */
         try {
index 13ea189a9288f38aabbbc723f26f59172873d324..a1c65f2371c5dc96c7b91f7b4e17448ca47200bc 100644 (file)
@@ -223,8 +223,10 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent
      */
     protected void resetAnalysis() {
         TmfCoreTracer.traceAnalysis(getId(), getTrace(), "reset: ready for execution"); //$NON-NLS-1$
-        fFinishedLatch.countDown();
-        fFinishedLatch = new CountDownLatch(1);
+        synchronized (syncObj) {
+            fFinishedLatch.countDown();
+            fFinishedLatch = new CountDownLatch(1);
+        }
     }
 
     /**
@@ -266,7 +268,9 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent
     public final void cancel() {
         synchronized (syncObj) {
             TmfCoreTracer.traceAnalysis(getId(), getTrace(), "cancelled by application"); //$NON-NLS-1$
-            if (fJob != null && fJob.cancel()) {
+            Job job = fJob;
+            if (job != null) {
+                job.cancel();
                 fAnalysisCancelled = true;
                 setAnalysisCompleted();
             }
@@ -408,8 +412,16 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent
 
     @Override
     public boolean waitForCompletion() {
+        CountDownLatch finishedLatch;
+        boolean started;
+        synchronized (syncObj) {
+            finishedLatch = fFinishedLatch;
+            started = fStarted;
+        }
         try {
-            fFinishedLatch.await();
+            if (started) {
+                finishedLatch.await();
+            }
         } catch (InterruptedException e) {
             Activator.logError("Error while waiting for module completion", e); //$NON-NLS-1$
         }
This page took 0.025997 seconds and 5 git commands to generate.