You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2012/08/06 21:47:31 UTC

svn commit: r1369951 - /maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java

Author: krosenvold
Date: Mon Aug  6 19:47:31 2012
New Revision: 1369951

URL: http://svn.apache.org/viewvc?rev=1369951&view=rev
Log:
[SUREFIRE-897] System.exit() in ForkedBooter might hang due to swing/windows bug.

Patch by Ralf Stuckert, applied with some modifications

Modified:
    maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java

Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java?rev=1369951&r1=1369950&r2=1369951&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java (original)
+++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java Mon Aug  6 19:47:31 2012
@@ -77,7 +77,7 @@ public class ForkedBooter
             originalOut.println( "Z,0,BYE!" );
             originalOut.flush();
             // noinspection CallToSystemExit
-            System.exit( 0 );
+            exit( 0 );
         }
         catch ( Throwable t )
         {
@@ -85,10 +85,19 @@ public class ForkedBooter
             // noinspection UseOfSystemOutOrSystemErr
             t.printStackTrace( System.err );
             // noinspection ProhibitedExceptionThrown,CallToSystemExit
-            System.exit( 1 );
+            exit( 1 );
         }
     }
 
+    private final static long SYSTEM_EXIT_TIMEOUT = 30 * 1000;
+
+    private static void exit( final int returnCode )
+    {
+        launchLastDitchDaemonShutdownThread( returnCode );
+        System.exit( returnCode );
+    }
+
+
     public static RunResult runSuitesInProcess( Object testSet, ClassLoader testsClassLoader,
                                                 StartupConfiguration startupConfiguration,
                                                 ProviderConfiguration providerConfiguration )
@@ -112,4 +121,25 @@ public class ForkedBooter
         final PrintStream originalSystemOut = providerConfiguration.getReporterConfiguration().getOriginalSystemOut();
         return surefireReflector.createForkingReporterFactory( trimStackTrace, originalSystemOut );
     }
+
+    private static void launchLastDitchDaemonShutdownThread( final int returnCode )
+    {
+        Thread lastExit = new Thread( new Runnable()
+        {
+            public void run()
+            {
+                try
+                {
+                    Thread.sleep( SYSTEM_EXIT_TIMEOUT );
+                    Runtime.getRuntime().halt( returnCode );
+                }
+                catch ( InterruptedException ignore )
+                {
+                }
+            }
+        } );
+        lastExit.setDaemon( true );
+        lastExit.start();
+    }
+
 }