From f999b4aa63289cc5fb2941e9fa5f47e742e23fac Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 13 May 2010 09:56:15 -0700 Subject: [PATCH] Fix interrupted write in StreamCopyThread If a flush() gets delivered at the same time that we are blocking while writing to an interruptable stream, the copy thread will abort assuming its a stream error. Instead ignore the interrupt, and retry the write. Change-Id: Icbf62d1b8abe0fabbb532dbee088020eecf4c6c2 Signed-off-by: Shawn O. Pearce --- .../eclipse/jgit/util/io/StreamCopyThread.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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 50f42ad4f..bf47d199a 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 @@ -100,11 +100,25 @@ public class StreamCopyThread extends Thread { try { n = src.read(buf); } catch (InterruptedIOException wakey) { - continue; + if (flushCounter.get() > 0) + continue; + else + throw wakey; } if (n < 0) break; - dst.write(buf, 0, n); + + for (;;) { + try { + dst.write(buf, 0, n); + } catch (InterruptedIOException wakey) { + if (flushCounter.get() > 0) + continue; + else + throw wakey; + } + break; + } } catch (IOException e) { break; }