[SUREFIRE] refactoring + improve: synchronization,use only daemon threads,using interrupted threads
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/e53ab122 Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/e53ab122 Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/e53ab122 Branch: refs/heads/master Commit: e53ab1229add11b89532ba054312c870ef77ab3c Parents: 7d9c438 Author: Tibor17 <tibo...@lycos.com> Authored: Sat Jul 11 16:39:44 2015 +0200 Committer: Tibor17 <tibo...@lycos.com> Committed: Thu Jul 23 23:28:01 2015 +0200 ---------------------------------------------------------------------- .../surefire/booterclient/ForkStarter.java | 20 +++- .../TestProvidingInputStream.java | 102 +++++++++++------ .../booterclient/output/ForkClient.java | 23 ++-- .../output/ThreadedStreamConsumer.java | 10 +- .../booterclient/ForkingRunListenerTest.java | 4 +- .../surefire/booter/ForkingRunListener.java | 8 +- .../util/internal/DaemonThreadFactory.java | 112 +++++++++++++++++++ .../maven/surefire/booter/ForkedBooter.java | 8 +- .../surefire/report/RunnableTestClass1.java | 5 +- .../report/SmartStackTraceParserTest.java | 6 +- .../common/junit4/JUnit4RunListenerTest.java | 3 +- .../junitcore/ConfigurableParallelComputer.java | 15 ++- .../surefire/junitcore/pc/ParallelComputer.java | 6 +- .../junitcore/pc/ParallelComputerBuilder.java | 12 +- .../junitcore/pc/SchedulingStrategies.java | 8 +- .../junitcore/pc/SingleThreadScheduler.java | 11 +- .../junitcore/pc/SchedulingStrategiesTest.java | 6 +- 17 files changed, 263 insertions(+), 96 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java index 7022bf8..0514e47 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java @@ -48,6 +48,7 @@ import org.apache.maven.surefire.report.StackTraceWriter; import org.apache.maven.surefire.suite.RunResult; import org.apache.maven.surefire.testset.TestRequest; import org.apache.maven.surefire.util.DefaultScanResult; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.apache.maven.surefire.util.internal.StringUtils; import java.io.File; @@ -66,6 +67,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -89,6 +91,8 @@ import static org.apache.maven.surefire.booter.Classpath.join; */ public class ForkStarter { + private final ThreadFactory threadFactory = DaemonThreadFactory.newDaemonThreadFactory(); + /** * Closes an InputStream */ @@ -206,9 +210,9 @@ public class ForkStarter { ArrayList<Future<RunResult>> results = new ArrayList<Future<RunResult>>( forkCount ); - ExecutorService executorService = new ThreadPoolExecutor( forkCount, forkCount, 60, TimeUnit.SECONDS, + ThreadPoolExecutor executorService = new ThreadPoolExecutor( forkCount, forkCount, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>( forkCount ) ); - + executorService.setThreadFactory( threadFactory ); try { // Ask to the executorService to run all tasks @@ -267,6 +271,8 @@ public class ForkStarter } catch ( InterruptedException e ) { + executorService.shutdownNow(); + Thread.currentThread().interrupt(); throw new SurefireBooterForkException( "Interrupted", e ); } catch ( ExecutionException e ) @@ -288,11 +294,10 @@ public class ForkStarter private RunResult runSuitesForkPerTestSet( final SurefireProperties effectiveSystemProperties, final int forkCount ) throws SurefireBooterForkException { - ArrayList<Future<RunResult>> results = new ArrayList<Future<RunResult>>( 500 ); - ExecutorService executorService = + ThreadPoolExecutor executorService = new ThreadPoolExecutor( forkCount, forkCount, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>() ); - + executorService.setThreadFactory( threadFactory ); try { // Ask to the executorService to run all tasks @@ -335,6 +340,8 @@ public class ForkStarter } catch ( InterruptedException e ) { + executorService.shutdownNow(); + Thread.currentThread().interrupt(); throw new SurefireBooterForkException( "Interrupted", e ); } catch ( ExecutionException e ) @@ -364,6 +371,7 @@ public class ForkStarter } catch ( InterruptedException e ) { + Thread.currentThread().interrupt(); throw new SurefireBooterForkException( "Interrupted", e ); } } @@ -439,7 +447,7 @@ public class ForkStarter { testProvidingInputStream.setFlushReceiverProvider( cli ); inputStreamCloser = new InputStreamCloser( testProvidingInputStream ); - inputStreamCloserHook = new Thread( inputStreamCloser ); + inputStreamCloserHook = DaemonThreadFactory.newDaemonThread( inputStreamCloser, "input-stream-closer" ); ShutdownHookUtils.addShutDownHook( inputStreamCloserHook ); } else http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStream.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStream.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStream.java index e7a5032..9f40bf7 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStream.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStream.java @@ -19,10 +19,12 @@ package org.apache.maven.plugin.surefire.booterclient.lazytestprovider; * under the License. */ +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.Queue; -import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; import static org.apache.maven.surefire.util.internal.StringUtils.encodeStringForForkCommunication; @@ -40,17 +42,19 @@ import static org.apache.maven.surefire.util.internal.StringUtils.encodeStringFo public class TestProvidingInputStream extends InputStream { + private final ReentrantLock lock = new ReentrantLock(); + + private final Condition lockCondition = lock.newCondition(); + private final Queue<String> testItemQueue; private byte[] currentBuffer; private int currentPos; - private final Semaphore semaphore = new Semaphore( 0 ); - - private FlushReceiverProvider flushReceiverProvider; + private volatile FlushReceiverProvider flushReceiverProvider; - private volatile boolean closed = false; + private volatile boolean closed; /** * C'tor @@ -72,43 +76,58 @@ public class TestProvidingInputStream @SuppressWarnings( "checkstyle:magicnumber" ) @Override - public synchronized int read() + public int read() throws IOException { - if ( null == currentBuffer ) + lock.lock(); + try { - if ( null != flushReceiverProvider && null != flushReceiverProvider.getFlushReceiver() ) - { - flushReceiverProvider.getFlushReceiver().flush(); - } - - semaphore.acquireUninterruptibly(); - if ( closed ) { - return -1; - } - - String currentElement = testItemQueue.poll(); - if ( currentElement != null ) - { - currentBuffer = encodeStringForForkCommunication( currentElement ); - currentPos = 0; + throw new EOFException( "closed unexpectedly" ); } else { - return -1; + if ( null == currentBuffer ) + { + if ( null != flushReceiverProvider && null != flushReceiverProvider.getFlushReceiver() ) + { + flushReceiverProvider.getFlushReceiver().flush(); + } + + lockCondition.awaitUninterruptibly(); + + if ( closed ) + { + throw new EOFException( "closed unexpectedly" ); + } + + String currentElement = testItemQueue.poll(); + if ( currentElement != null ) + { + currentBuffer = encodeStringForForkCommunication( currentElement ); + currentPos = 0; + } + else + { + return -1; + } + } + + if ( currentPos < currentBuffer.length ) + { + return currentBuffer[currentPos++] & 0xff; + } + else + { + currentBuffer = null; + return '\n' & 0xff; + } } } - - if ( currentPos < currentBuffer.length ) + finally { - return currentBuffer[currentPos++] & 0xff; - } - else - { - currentBuffer = null; - return '\n' & 0xff; + lock.unlock(); } } @@ -117,13 +136,30 @@ public class TestProvidingInputStream */ public void provideNewTest() { - semaphore.release(); + lock.lock(); + try + { + lockCondition.signalAll(); + } + finally + { + lock.unlock(); + } } @Override public void close() { closed = true; - semaphore.release(); + lock.lock(); + try + { + currentBuffer = null; + lockCondition.signalAll(); + } + finally + { + lock.unlock(); + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java index cea1824..54ee5e4 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java @@ -23,12 +23,11 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.nio.ByteBuffer; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; import java.util.NoSuchElementException; import java.util.Properties; import java.util.StringTokenizer; +import java.util.concurrent.ConcurrentHashMap; import org.apache.maven.plugin.surefire.booterclient.lazytestprovider.TestProvidingInputStream; import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; @@ -51,19 +50,17 @@ import org.apache.maven.surefire.util.internal.StringUtils; public class ForkClient implements StreamConsumer { - private final DefaultReporterFactory defaultReporterFactory; private final TestProvidingInputStream testProvidingInputStream; - private final Map<Integer, RunListener> testSetReporters = - Collections.synchronizedMap( new HashMap<Integer, RunListener>() ); + private final Map<Integer, RunListener> testSetReporters = new ConcurrentHashMap<Integer, RunListener>(); private final Properties testVmSystemProperties; - private volatile boolean saidGoodBye = false; + private volatile boolean saidGoodBye; - private volatile StackTraceWriter errorInFork = null; + private volatile StackTraceWriter errorInFork; public ForkClient( DefaultReporterFactory defaultReporterFactory, Properties testVmSystemProperties ) { @@ -98,7 +95,7 @@ public class ForkClient System.out.println( s ); return; } - final Integer channelNumber = Integer.parseInt( s.substring( 2, commma ), 16 ); + final int channelNumber = Integer.parseInt( s.substring( 2, commma ), 16 ); int rest = s.indexOf( ",", commma ); final String remaining = s.substring( rest + 1 ); @@ -181,7 +178,7 @@ public class ForkClient } } - private void writeTestOutput( final Integer channelNumber, final String remaining, boolean isStdout ) + private void writeTestOutput( final int channelNumber, final String remaining, boolean isStdout ) { int csNameEnd = remaining.indexOf( ',' ); String charsetName = remaining.substring( 0, csNameEnd ); @@ -277,12 +274,12 @@ public class ForkClient * @param channelNumber The logical channel number * @return A mock provider reporter */ - public RunListener getReporter( Integer channelNumber ) + public RunListener getReporter( int channelNumber ) { return testSetReporters.get( channelNumber ); } - private RunListener getOrCreateReporter( Integer channelNumber ) + private RunListener getOrCreateReporter( int channelNumber ) { RunListener reporter = testSetReporters.get( channelNumber ); if ( reporter == null ) @@ -293,12 +290,12 @@ public class ForkClient return reporter; } - private ConsoleOutputReceiver getOrCreateConsoleOutputReceiver( Integer channelNumber ) + private ConsoleOutputReceiver getOrCreateConsoleOutputReceiver( int channelNumber ) { return (ConsoleOutputReceiver) getOrCreateReporter( channelNumber ); } - private ConsoleLogger getOrCreateConsoleLogger( Integer channelNumber ) + private ConsoleLogger getOrCreateConsoleLogger( int channelNumber ) { return (ConsoleLogger) getOrCreateReporter( channelNumber ); } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java index 7574eec..c7b4e66 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java @@ -20,7 +20,9 @@ package org.apache.maven.plugin.surefire.booterclient.output; */ import org.apache.maven.shared.utils.cli.StreamConsumer; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** @@ -31,7 +33,7 @@ import java.util.concurrent.LinkedBlockingQueue; public class ThreadedStreamConsumer implements StreamConsumer { - private final java.util.concurrent.BlockingQueue<String> items = new LinkedBlockingQueue<String>(); + private final BlockingQueue<String> items = new LinkedBlockingQueue<String>(); private static final String POISON = "Pioson"; private static final int ITEM_LIMIT_BEFORE_SLEEP = 10000; @@ -43,14 +45,14 @@ public class ThreadedStreamConsumer static class Pumper implements Runnable { - private final java.util.concurrent.BlockingQueue<String> queue; + private final BlockingQueue<String> queue; private final StreamConsumer target; private volatile Throwable throwable; - Pumper( java.util.concurrent.BlockingQueue<String> queue, StreamConsumer target ) + Pumper( BlockingQueue<String> queue, StreamConsumer target ) { this.queue = queue; this.target = target; @@ -85,7 +87,7 @@ public class ThreadedStreamConsumer public ThreadedStreamConsumer( StreamConsumer target ) { pumper = new Pumper( items, target ); - thread = new Thread( pumper, "ThreadedStreamConsumer" ); + thread = DaemonThreadFactory.newDaemonThread( pumper, "ThreadedStreamConsumer" ); thread.start(); } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java index fd85b44..31e511c 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java @@ -53,9 +53,9 @@ public class ForkingRunListenerTest private final PrintStream printStream; - final Integer defaultChannel = 17; + final int defaultChannel = 17; - final Integer anotherChannel = 18; + final int anotherChannel = 18; public ForkingRunListenerTest() { http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java ---------------------------------------------------------------------- diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java index 719679f..203651e 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java @@ -155,14 +155,8 @@ public class ForkingRunListener while ( propertyKeys.hasMoreElements() ) { String key = (String) propertyKeys.nextElement(); - String value = systemProperties.getProperty( key ); - - if ( value == null ) - { - value = "null"; - } - encodeAndWriteToTarget( toPropertyString( key, value ) ); + encodeAndWriteToTarget( toPropertyString( key, value == null ? "null" : value ) ); } } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-api/src/main/java/org/apache/maven/surefire/util/internal/DaemonThreadFactory.java ---------------------------------------------------------------------- diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/util/internal/DaemonThreadFactory.java b/surefire-api/src/main/java/org/apache/maven/surefire/util/internal/DaemonThreadFactory.java new file mode 100644 index 0000000..29eb18d --- /dev/null +++ b/surefire-api/src/main/java/org/apache/maven/surefire/util/internal/DaemonThreadFactory.java @@ -0,0 +1,112 @@ +package org.apache.maven.surefire.util.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Creates new daemon Thread. + */ +public final class DaemonThreadFactory + implements ThreadFactory +{ + private static final AtomicInteger POOL_NUMBER = new AtomicInteger( 1 ); + + private final AtomicInteger threadNumber = new AtomicInteger( 1 ); + + private final ThreadGroup group; + + private final String namePrefix; + + private DaemonThreadFactory() + { + SecurityManager s = System.getSecurityManager(); + group = s != null ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + namePrefix = "pool-" + POOL_NUMBER.getAndIncrement() + "-thread-"; + } + + public Thread newThread( Runnable r ) + { + Thread t = new Thread( group, r, namePrefix + threadNumber.getAndIncrement() ); + if ( t.getPriority() != Thread.NORM_PRIORITY ) + { + t.setPriority( Thread.NORM_PRIORITY ); + } + t.setDaemon( true ); + return t; + } + + /** + * Should be used by thread pools. + */ + public static ThreadFactory newDaemonThreadFactory() + { + return new DaemonThreadFactory(); + } + + public static ThreadFactory newDaemonThreadFactory( String name ) + { + return new NamedThreadFactory( name ); + } + + public static Thread newDaemonThread( Runnable r ) + { + SecurityManager s = System.getSecurityManager(); + ThreadGroup group = s == null ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); + Thread t = new Thread( group, r ); + if ( t.getPriority() != Thread.NORM_PRIORITY ) + { + t.setPriority( Thread.NORM_PRIORITY ); + } + t.setDaemon( true ); + return t; + } + + public static Thread newDaemonThread( Runnable r, String name ) + { + SecurityManager s = System.getSecurityManager(); + ThreadGroup group = s == null ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); + Thread t = new Thread( group, r, name ); + if ( t.getPriority() != Thread.NORM_PRIORITY ) + { + t.setPriority( Thread.NORM_PRIORITY ); + } + t.setDaemon( true ); + return t; + } + + private static class NamedThreadFactory + implements ThreadFactory + { + + private final String name; + + private NamedThreadFactory( String name ) + { + this.name = name; + } + + public Thread newThread( Runnable r ) + { + return newDaemonThread( r, name ); + } + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java ---------------------------------------------------------------------- diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java index f59461a..ac73564 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java @@ -33,6 +33,7 @@ import org.apache.maven.surefire.report.StackTraceWriter; import org.apache.maven.surefire.suite.RunResult; import org.apache.maven.surefire.testset.TestSetFailedException; import org.apache.maven.surefire.util.ReflectionUtils; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import static org.apache.maven.surefire.util.internal.StringUtils.encodeStringForForkCommunication; @@ -48,7 +49,6 @@ import static org.apache.maven.surefire.util.internal.StringUtils.encodeStringFo */ public class ForkedBooter { - /** * This method is invoked when Surefire is forked - this method parses and organizes the arguments passed to it and * then calls the Surefire class' run method. <p/> The system exit code will be 1 if an exception is thrown. @@ -174,7 +174,7 @@ public class ForkedBooter @SuppressWarnings( "checkstyle:emptyblock" ) private static void launchLastDitchDaemonShutdownThread( final int returnCode ) { - Thread lastExit = new Thread( new Runnable() + DaemonThreadFactory.newDaemonThread( new Runnable() { public void run() { @@ -187,9 +187,7 @@ public class ForkedBooter { } } - } ); - lastExit.setDaemon( true ); - lastExit.start(); + }, "last-ditch-daemon-shutdown-thread-" + SYSTEM_EXIT_TIMEOUT ).start(); } public static RunResult invokeProviderInSameClassLoader( Object testSet, Object factory, http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/RunnableTestClass1.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/RunnableTestClass1.java b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/RunnableTestClass1.java index 58ed78d..8414903 100644 --- a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/RunnableTestClass1.java +++ b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/RunnableTestClass1.java @@ -1,5 +1,7 @@ package org.apache.maven.surefire.report; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; + import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; @@ -24,7 +26,6 @@ import java.util.concurrent.FutureTask; */ class RunnableTestClass1 implements Callable<Object> - { public Object call() throws Exception @@ -38,7 +39,7 @@ class RunnableTestClass1 { RunnableTestClass2 rt2 = new RunnableTestClass2(); FutureTask<Object> futureTask = new FutureTask<Object>( rt2 ); - new Thread( futureTask ).start(); + DaemonThreadFactory.newDaemonThread( futureTask ).start(); try { futureTask.get(); http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java index 4d39184..e600718 100644 --- a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java +++ b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java @@ -27,6 +27,7 @@ import java.util.concurrent.FutureTask; import junit.framework.AssertionFailedError; import junit.framework.ComparisonFailure; import junit.framework.TestCase; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import static org.apache.maven.surefire.report.SmartStackTraceParser.*; @@ -34,7 +35,6 @@ import static org.apache.maven.surefire.report.SmartStackTraceParser.*; public class SmartStackTraceParserTest extends TestCase { - public void testGetString() throws Exception { @@ -306,7 +306,7 @@ public class SmartStackTraceParserTest public ExecutionException getSingleNested() { FutureTask<Object> futureTask = new FutureTask<Object>( new RunnableTestClass2() ); - new Thread( futureTask ).start(); + DaemonThreadFactory.newDaemonThread( futureTask ).start(); try { futureTask.get(); @@ -326,7 +326,7 @@ public class SmartStackTraceParserTest private ExecutionException getDoubleNestedException() { FutureTask<Object> futureTask = new FutureTask<Object>( new RunnableTestClass1() ); - new Thread( futureTask ).start(); + DaemonThreadFactory.newDaemonThread( futureTask ).start(); try { futureTask.get(); http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/JUnit4RunListenerTest.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/JUnit4RunListenerTest.java b/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/JUnit4RunListenerTest.java index 1bd27cb..c4765e9 100644 --- a/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/JUnit4RunListenerTest.java +++ b/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/JUnit4RunListenerTest.java @@ -23,6 +23,7 @@ import java.util.concurrent.CountDownLatch; import org.apache.maven.surefire.junit4.MockReporter; import junit.framework.Assert; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.Request; @@ -59,7 +60,7 @@ public class JUnit4RunListenerTest jUnit4TestSetReporter.testStarted( testSomething ); - new Thread( new Runnable() + DaemonThreadFactory.newDaemonThread( new Runnable() { public void run() { http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java index d664edc..0c1898b 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java @@ -25,7 +25,9 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.runner.Computer; import org.junit.runner.Runner; import org.junit.runners.ParentRunner; @@ -44,6 +46,8 @@ import org.junit.runners.model.RunnerScheduler; public class ConfigurableParallelComputer extends Computer { + private static final ThreadFactory DAEMON_THREAD_FACTORY = DaemonThreadFactory.newDaemonThreadFactory(); + private final boolean fClasses; private final boolean fMethods; @@ -58,18 +62,21 @@ public class ConfigurableParallelComputer public ConfigurableParallelComputer() { - this( true, true, Executors.newCachedThreadPool(), false ); + this( true, true, Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ), false ); } public ConfigurableParallelComputer( boolean fClasses, boolean fMethods ) { - this( fClasses, fMethods, Executors.newCachedThreadPool(), false ); + this( fClasses, fMethods, Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ), false ); } public ConfigurableParallelComputer( boolean fClasses, boolean fMethods, Integer numberOfThreads, boolean perCore ) { - this( fClasses, fMethods, Executors.newFixedThreadPool( - numberOfThreads * ( perCore ? Runtime.getRuntime().availableProcessors() : 1 ) ), true ); + this( fClasses, fMethods, + Executors.newFixedThreadPool( + numberOfThreads * ( perCore ? Runtime.getRuntime().availableProcessors() : 1 ), + DAEMON_THREAD_FACTORY ), + true ); } private ConfigurableParallelComputer( boolean fClasses, boolean fMethods, ExecutorService executorService, http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java index 5491a68..afec8a3 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java @@ -20,6 +20,7 @@ package org.apache.maven.surefire.junitcore.pc; */ import org.apache.maven.surefire.testset.TestSetFailedException; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.runner.Computer; import org.junit.runner.Description; @@ -30,6 +31,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; import static java.util.concurrent.TimeUnit.NANOSECONDS; @@ -43,6 +45,8 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; public abstract class ParallelComputer extends Computer { + private static final ThreadFactory DAEMON_THREAD_FACTORY = DaemonThreadFactory.newDaemonThreadFactory(); + private static final double NANOS_IN_A_SECOND = 1E9; private final ShutdownStatus shutdownStatus = new ShutdownStatus(); @@ -169,7 +173,7 @@ public abstract class ParallelComputer { if ( shutdownScheduler == null ) { - shutdownScheduler = Executors.newScheduledThreadPool( 2 ); + shutdownScheduler = Executors.newScheduledThreadPool( 2, DAEMON_THREAD_FACTORY ); } return shutdownScheduler; } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java index 2ef3fd1..fdc4473 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java @@ -32,10 +32,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import org.apache.maven.surefire.junitcore.JUnitCoreParameters; import org.apache.maven.surefire.report.ConsoleLogger; import org.apache.maven.surefire.testset.TestSetFailedException; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.internal.runners.ErrorReportingRunner; import org.junit.runner.Description; import org.junit.runner.Runner; @@ -78,6 +80,8 @@ import static org.apache.maven.surefire.junitcore.pc.Type.SUITES; */ public final class ParallelComputerBuilder { + private static final ThreadFactory DAEMON_THREAD_FACTORY = DaemonThreadFactory.newDaemonThreadFactory(); + private static final Class<? extends Annotation> JCIP_NOT_THREAD_SAFE = loadNotThreadSafeAnnotations(); private static final Set<?> NULL_SINGLETON = Collections.singleton( null ); @@ -403,8 +407,8 @@ public final class ParallelComputerBuilder private ExecutorService createPool( int poolSize ) { return poolSize < Integer.MAX_VALUE - ? Executors.newFixedThreadPool( poolSize ) - : Executors.newCachedThreadPool(); + ? Executors.newFixedThreadPool( poolSize, DAEMON_THREAD_FACTORY ) + : Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ); } private Scheduler createMaster( ExecutorService pool, int poolSize ) @@ -574,11 +578,11 @@ public final class ParallelComputerBuilder ExecutorService pool = null; if ( poolSize == Integer.MAX_VALUE ) { - pool = Executors.newCachedThreadPool(); + pool = Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ); } else if ( poolSize > 0 ) { - pool = Executors.newFixedThreadPool( poolSize ); + pool = Executors.newFixedThreadPool( poolSize, DAEMON_THREAD_FACTORY ); } boolean doParallel = pool != null; for ( ParentRunner runner : runners ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java index a7f45f8..6706951 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java @@ -20,9 +20,11 @@ package org.apache.maven.surefire.junitcore.pc; */ import org.apache.maven.surefire.report.ConsoleLogger; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; /** * The factory of {@link SchedulingStrategy}. @@ -32,6 +34,7 @@ import java.util.concurrent.Executors; */ public class SchedulingStrategies { + private static final ThreadFactory DAEMON_THREAD_FACTORY = DaemonThreadFactory.newDaemonThreadFactory(); /** * @param logger current error logger @@ -49,7 +52,8 @@ public class SchedulingStrategies */ public static SchedulingStrategy createParallelStrategy( ConsoleLogger logger, int nThreads ) { - return new NonSharedThreadPoolStrategy( logger, Executors.newFixedThreadPool( nThreads ) ); + return new NonSharedThreadPoolStrategy( logger, + Executors.newFixedThreadPool( nThreads, DAEMON_THREAD_FACTORY ) ); } /** @@ -58,7 +62,7 @@ public class SchedulingStrategies */ public static SchedulingStrategy createParallelStrategyUnbounded( ConsoleLogger logger ) { - return new NonSharedThreadPoolStrategy( logger, Executors.newCachedThreadPool() ); + return new NonSharedThreadPoolStrategy( logger, Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ) ); } /** http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java index c235a15..88ae625 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java @@ -20,6 +20,7 @@ package org.apache.maven.surefire.junitcore.pc; */ import org.apache.maven.surefire.report.ConsoleLogger; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.runner.Description; import org.junit.runners.model.RunnerScheduler; @@ -49,14 +50,8 @@ final class SingleThreadScheduler private static ExecutorService newPool() { - final ThreadFactory factory = new ThreadFactory() - { - public Thread newThread( Runnable r ) - { - return new Thread( r, "maven-surefire-plugin@NotThreadSafe" ); - } - }; - return new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), factory ); + ThreadFactory tf = DaemonThreadFactory.newDaemonThreadFactory( "maven-surefire-plugin@NotThreadSafe" ); + return new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), tf ); } SingleThreadScheduler( ConsoleLogger logger ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e53ab122/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java index 10bb3bc..a47030c 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java @@ -20,10 +20,12 @@ package org.apache.maven.surefire.junitcore.pc; */ import org.apache.maven.surefire.junitcore.Logger; +import org.apache.maven.surefire.util.internal.DaemonThreadFactory; import org.junit.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -44,6 +46,8 @@ import static org.junit.Assert.assertTrue; */ public class SchedulingStrategiesTest { + private static final ThreadFactory DAEMON_THREAD_FACTORY = DaemonThreadFactory.newDaemonThreadFactory(); + @Test public void invokerStrategy() throws InterruptedException @@ -97,7 +101,7 @@ public class SchedulingStrategiesTest public void sharedPoolStrategy() throws InterruptedException { - ExecutorService sharedPool = Executors.newCachedThreadPool(); + ExecutorService sharedPool = Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ); SchedulingStrategy strategy1 = SchedulingStrategies.createParallelSharedStrategy( new Logger(), sharedPool ); assertTrue( strategy1.hasSharedThreadPool() );