summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorDmitry Neverov2010-05-13 12:50:44 (EDT)
committer Shawn O. Pearce2010-05-13 12:58:18 (EDT)
commit3f143b8d6b5c20098e041e22be42216e668a4a0b (patch)
tree764b921ab0cccfc1c51e8ca9020e04d2329f3757
parenta54e0bae687d4a3600fab87b1182d7303f097a92 (diff)
downloadjgit-3f143b8d6b5c20098e041e22be42216e668a4a0b.zip
jgit-3f143b8d6b5c20098e041e22be42216e668a4a0b.tar.gz
jgit-3f143b8d6b5c20098e041e22be42216e668a4a0b.tar.bz2
Fix missing flush in StreamCopyThreadrefs/changes/94/694/1
It is possible to miss flush() invocation in StreamCopyThread. In this case some data will not be sent to remote host and we will wait forever (or until timeout) in src.read(). Use a counter to keep track of the flush requests. Change-Id: Ia818be9b109a1674d9e2a9c78e125ab248cfb75b Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java22
1 files changed, 14 insertions, 8 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 a2b9540..50f42ad 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,6 +47,7 @@ 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 {
@@ -56,7 +57,7 @@ public class StreamCopyThread extends Thread {
private final OutputStream dst;
- private volatile boolean doFlush;
+ private final AtomicInteger flushCounter = new AtomicInteger(0);
/**
* Create a thread to copy data from an input stream to an output stream.
@@ -82,10 +83,8 @@ public class StreamCopyThread extends Thread {
* the request.
*/
public void flush() {
- if (!doFlush) {
- doFlush = true;
- interrupt();
- }
+ flushCounter.incrementAndGet();
+ interrupt();
}
@Override
@@ -94,10 +93,8 @@ public class StreamCopyThread extends Thread {
final byte[] buf = new byte[BUFFER_SIZE];
for (;;) {
try {
- if (doFlush) {
- doFlush = false;
+ if (needFlush())
dst.flush();
- }
final int n;
try {
@@ -125,4 +122,13 @@ public class StreamCopyThread extends Thread {
}
}
}
+
+ private boolean needFlush() {
+ int i = flushCounter.get();
+ if (i > 0) {
+ flushCounter.decrementAndGet();
+ return true;
+ }
+ return false;
+ }
}