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 <spearce@spearce.org>tags/v0.8.1
@@ -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; | |||
} |