From f0cb531b9459c2902b9aebe318b1eae11de09cf1 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Wed, 10 Dec 2014 23:24:30 +0100 Subject: [PATCH] Avoid dead-lock reading debugger output: close InputStream while blocking read from StreamReader, don't close StreamReader. --- .../python/debugger/pydev/RemoteDebugger.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java index c0af42cc4a75..de7b44f03abf 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java @@ -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