Author: krosenvold
Date: Fri Jun 19 18:20:42 2015
New Revision: 1686477

URL: http://svn.apache.org/r1686477
Log:
IO-488 FileUtils.waitFor(...) swallows thread interrupted status

Patch by Björn Buchner, testcase by me

Modified:
    commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
    
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsWaitForTestCase.java

Modified: 
commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java?rev=1686477&r1=1686476&r2=1686477&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java 
(original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java 
Fri Jun 19 18:20:42 2015
@@ -1706,19 +1706,26 @@ public class FileUtils {
     public static boolean waitFor(final File file, final int seconds) {
         int timeout = 0;
         int tick = 0;
-        while (!file.exists()) {
-            if (tick++ >= 10) {
-                tick = 0;
-                if (timeout++ > seconds) {
-                    return false;
+        boolean wasInterrupted = false;
+        try {
+            while (!file.exists()) {
+                if (tick++ >= 10) {
+                    tick = 0;
+                    if (timeout++ > seconds) {
+                        return false;
+                    }
+                }
+                try {
+                    Thread.sleep(100);
+                } catch (final InterruptedException ignore) {
+                    wasInterrupted = true;
+                } catch (final Exception ex) {
+                    break;
                 }
             }
-            try {
-                Thread.sleep(100);
-            } catch (final InterruptedException ignore) {
-                // ignore exception
-            } catch (final Exception ex) {
-                break;
+        } finally {
+            if (wasInterrupted) {
+                Thread.currentThread().interrupt();
             }
         }
         return true;

Modified: 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsWaitForTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsWaitForTestCase.java?rev=1686477&r1=1686476&r2=1686477&view=diff
==============================================================================
--- 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsWaitForTestCase.java
 (original)
+++ 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsWaitForTestCase.java
 Fri Jun 19 18:20:42 2015
@@ -17,6 +17,8 @@
 package org.apache.commons.io;
 
 import java.io.File;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.commons.io.testtools.FileBasedTestCase;
 
@@ -52,4 +54,23 @@ public class FileUtilsWaitForTestCase ex
         FileUtils.waitFor(new File(""), 2);
     }
 
+    public void testWaitForInterrupted() throws InterruptedException {
+        final AtomicBoolean wasInterrupted = new AtomicBoolean(false);
+        final CountDownLatch started = new CountDownLatch(1);
+        Runnable thread = new Runnable() {
+            @Override
+            public void run() {
+                started.countDown();
+                FileUtils.waitFor(new File(""), 2);
+                wasInterrupted.set( Thread.currentThread().isInterrupted());
+            }
+        };
+        Thread thread1 = new Thread(thread);
+        thread1.start();
+        started.await();
+        thread1.interrupt();
+        thread1.join();
+        assertTrue( wasInterrupted.get() );
+    }
+
 }


Reply via email to