diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java index f2715aca2..9129ece09 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java @@ -47,7 +47,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.io.OutputStream; -import java.util.concurrent.atomic.AtomicInteger; /** Thread to copy from an input stream to an output stream. */ public class StreamCopyThread extends Thread { @@ -57,8 +56,6 @@ public class StreamCopyThread extends Thread { private final OutputStream dst; - private final AtomicInteger flushCounter = new AtomicInteger(0); - private volatile boolean done; /** @@ -85,7 +82,6 @@ public class StreamCopyThread extends Thread { * the request. */ public void flush() { - flushCounter.incrementAndGet(); interrupt(); } @@ -113,10 +109,13 @@ public class StreamCopyThread extends Thread { public void run() { try { final byte[] buf = new byte[BUFFER_SIZE]; + int interruptCounter = 0; for (;;) { try { - if (needFlush()) + if (interruptCounter > 0) { dst.flush(); + interruptCounter--; + } if (done) break; @@ -125,17 +124,25 @@ public class StreamCopyThread extends Thread { try { n = src.read(buf); } catch (InterruptedIOException wakey) { + interruptCounter++; continue; } if (n < 0) break; + boolean writeInterrupted = false; for (;;) { try { dst.write(buf, 0, n); } catch (InterruptedIOException wakey) { + writeInterrupted = true; continue; } + + // set interrupt status, which will be checked + // when we block in src.read + if (writeInterrupted) + interrupt(); break; } } catch (IOException e) { @@ -155,13 +162,4 @@ public class StreamCopyThread extends Thread { } } } - - private boolean needFlush() { - int i = flushCounter.get(); - if (i > 0) { - flushCounter.decrementAndGet(); - return true; - } - return false; - } }