Author: krosenvold Date: Thu Apr 29 07:22:39 2010 New Revision: 939220 URL: http://svn.apache.org/viewvc?rev=939220&view=rev Log: [MNG-4633] Changed to use nice clean countdownlatch instead of synchronized booleans
Also updated phase locking to only lock when project being built changes phase Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilder.java maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ExecutionPlanItemTest.java Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java?rev=939220&r1=939219&r2=939220&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java Thu Apr 29 07:22:39 2010 @@ -19,7 +19,7 @@ import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.descriptor.MojoDescriptor; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.CountDownLatch; /** * Wraps individual MojoExecutions, containing information about completion status and scheduling. @@ -35,9 +35,7 @@ public class ExecutionPlanItem private final Schedule schedule; // Completeness just indicates that it has been run or failed - private final AtomicBoolean complete = new AtomicBoolean( false ); - - private final Object monitor = new Object(); + private final CountDownLatch done = new CountDownLatch( 1 ); public ExecutionPlanItem( MojoExecution mojoExecution, Schedule schedule ) { @@ -57,47 +55,23 @@ public class ExecutionPlanItem public void setComplete() { - boolean transitionSuccessful = ensureComplete(); - if ( !transitionSuccessful ) - { - throw new IllegalStateException( "Expected to be able to setComplete node, but was complete already" ); - } - } - - public boolean ensureComplete() - { - boolean f = complete.compareAndSet( false, true ); - notifyListeners(); - return f; + done.countDown(); } - private void notifyListeners() + public boolean isDone() { - synchronized ( monitor ) - { - monitor.notifyAll(); - } + return done.getCount() < 1; } public void forceComplete() { - final boolean b = complete.getAndSet( true ); - if ( !b ) - { - notifyListeners(); - } // Release anyone waiting for us + setComplete(); } public void waitUntilDone() throws InterruptedException { - synchronized ( monitor ) - { - while ( !complete.get() ) - { - monitor.wait( 100 ); - } - } + done.await(); } public Schedule getSchedule() Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilder.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilder.java?rev=939220&r1=939219&r2=939220&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilder.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilder.java Thu Apr 29 07:22:39 2010 @@ -205,7 +205,7 @@ public class LifecycleWeaveBuilder builtLogItem.setComplete(); ExecutionPlanItem nextPlanItem = planItems.hasNext() ? planItems.next() : null; - if ( nextPlanItem != null ) + if ( nextPlanItem != null && phaseRecorder.isDifferentPhase( nextPlanItem.getMojoExecution() ) ) { final Schedule scheduleOfNext = nextPlanItem.getSchedule(); @@ -215,12 +215,9 @@ public class LifecycleWeaveBuilder projectBuild ); } - if ( phaseRecorder.isDifferentPhase( nextPlanItem.getMojoExecution() ) ) + for ( ArtifactLink dependencyLink : dependencyLinks ) { - for ( ArtifactLink dependencyLink : dependencyLinks ) - { - dependencyLink.resolveFromUpstream(); - } + dependencyLink.resolveFromUpstream(); } } current = nextPlanItem; @@ -259,13 +256,13 @@ public class LifecycleWeaveBuilder { final MavenExecutionPlan upstreamPlan = executionPlans.get( upstreamProject ); final String nextPhase = nextPlanItem.getLifecyclePhase(); - final ExecutionPlanItem inSchedule = upstreamPlan.findLastInPhase( nextPhase ); + final ExecutionPlanItem upstream = upstreamPlan.findLastInPhase( nextPhase ); - if ( inSchedule != null ) + if ( upstream != null ) { long startWait = System.currentTimeMillis(); - inSchedule.waitUntilDone(); - builtLogItem.addWait( upstreamProject, inSchedule, startWait ); + upstream.waitUntilDone(); + builtLogItem.addWait( upstreamProject, upstream, startWait ); } else if ( !upstreamPlan.containsPhase( nextPhase ) ) { Modified: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java?rev=939220&r1=939219&r2=939220&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java (original) +++ maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java Thu Apr 29 07:22:39 2010 @@ -46,8 +46,8 @@ public class MavenExecutionPlanTest MavenExecutionPlan plan = LifecycleExecutionPlanCalculatorStub.getProjectAExceutionPlan(); plan.forceAllComplete(); final Iterator<ExecutionPlanItem> planItemIterator = plan.iterator(); - assertFalse( planItemIterator.next().ensureComplete() ); - assertFalse( planItemIterator.next().ensureComplete() ); + assertTrue( planItemIterator.next().isDone() ); + assertTrue( planItemIterator.next().isDone() ); } public void testFindLastInPhase() Modified: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ExecutionPlanItemTest.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ExecutionPlanItemTest.java?rev=939220&r1=939219&r2=939220&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ExecutionPlanItemTest.java (original) +++ maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ExecutionPlanItemTest.java Thu Apr 29 07:22:39 2010 @@ -31,7 +31,7 @@ public class ExecutionPlanItemTest { ExecutionPlanItem item = createExecutionPlanItem( "testMojo", null ); item.setComplete(); // This itself is a valid test - assertFalse( item.ensureComplete() ); + assertTrue( item.isDone() ); } public void testWaitUntilDone()