Avoid dead-lock reading debugger output: close InputStream while blocking read from StreamReader, don't close StreamReader.

This commit is contained in:
Dmitry Trofimov
2014-12-10 23:24:30 +01:00
parent 0c81c8d133
commit f0cb531b94
@@ -22,7 +22,10 @@ import com.jetbrains.python.debugger.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
@@ -473,20 +476,18 @@ public class RemoteDebugger implements ProcessDebugger {
public DebuggerReader createReader(@NotNull Socket socket) throws IOException {
synchronized (mySocketObject) {
final InputStream myInputStream = socket.getInputStream();
//noinspection IOResourceOpenedButNotSafelyClosed
final Reader reader = new InputStreamReader(myInputStream, CharsetToolkit.UTF8_CHARSET); //TODO: correct econding?
return new DebuggerReader(reader);
return new DebuggerReader(socket.getInputStream());
}
}
private class DebuggerReader extends BaseOutputReader {
private Reader myReader;
private StringBuilder myTextBuilder = new StringBuilder();
private final InputStream myInputStream;
private DebuggerReader(final Reader reader) throws IOException {
super(reader);
myReader = reader;
private DebuggerReader(final InputStream stream) throws IOException {
super(new InputStreamReader(stream, CharsetToolkit.UTF8_CHARSET)); //TODO: correct econding?);
myInputStream = stream;
start();
}
@@ -609,21 +610,18 @@ public class RemoteDebugger implements ProcessDebugger {
return ProtocolParser.parseThread(frame.getPayload(), myDebugProcess.getPositionConverter());
}
private void closeReader(Reader reader) {
try {
reader.close();
}
catch (IOException ignore) {
}
}
@Override
protected Future<?> executeOnPooledThread(Runnable runnable) {
return ApplicationManager.getApplication().executeOnPooledThread(runnable);
}
public void close() {
closeReader(myReader);
try {
myInputStream.close();
}
catch (Exception e) {
LOG.error(e);
}
}
@Override