aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java8
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java25
2 files changed, 29 insertions, 4 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
index d73e2055a5..8df3ea5b2b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
@@ -232,7 +232,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
class SshFetchConnection extends BasePackFetchConnection {
private ChannelExec channel;
- private Thread errorThread;
+ private StreamCopyThread errorThread;
private int exitStatus;
@@ -275,7 +275,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
if (errorThread != null) {
try {
- errorThread.join();
+ errorThread.halt();
} catch (InterruptedException e) {
// Stop waiting and return anyway.
} finally {
@@ -300,7 +300,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
class SshPushConnection extends BasePackPushConnection {
private ChannelExec channel;
- private Thread errorThread;
+ private StreamCopyThread errorThread;
private int exitStatus;
@@ -343,7 +343,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
if (errorThread != null) {
try {
- errorThread.join();
+ errorThread.halt();
} catch (InterruptedException e) {
// Stop waiting and return anyway.
} finally {
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 c36835692d..f2715aca2b 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
@@ -59,6 +59,8 @@ public class StreamCopyThread extends Thread {
private final AtomicInteger flushCounter = new AtomicInteger(0);
+ private volatile boolean done;
+
/**
* Create a thread to copy data from an input stream to an output stream.
*
@@ -87,6 +89,26 @@ public class StreamCopyThread extends Thread {
interrupt();
}
+ /**
+ * Request that the thread terminate, and wait for it.
+ * <p>
+ * This method signals to the copy thread that it should stop as soon as
+ * there is no more IO occurring.
+ *
+ * @throws InterruptedException
+ * the calling thread was interrupted.
+ */
+ public void halt() throws InterruptedException {
+ for (;;) {
+ join(250 /* milliseconds */);
+ if (isAlive()) {
+ done = true;
+ interrupt();
+ } else
+ break;
+ }
+ }
+
@Override
public void run() {
try {
@@ -96,6 +118,9 @@ public class StreamCopyThread extends Thread {
if (needFlush())
dst.flush();
+ if (done)
+ break;
+
final int n;
try {
n = src.read(buf);