diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/BaseDebuggerTransport.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/BaseDebuggerTransport.java index d1bef3683246..1b99f746f705 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/BaseDebuggerTransport.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/BaseDebuggerTransport.java @@ -30,8 +30,7 @@ public abstract class BaseDebuggerTransport implements DebuggerTransport { return sendMessageImpl(packed); } catch (SocketException se) { - myDebugger.disconnect(); - myDebugger.fireCommunicationError(); + onSocketException(); } catch (IOException e) { LOG.debug(e); @@ -41,6 +40,8 @@ public abstract class BaseDebuggerTransport implements DebuggerTransport { protected abstract boolean sendMessageImpl(byte[] packed) throws IOException; + protected abstract void onSocketException(); + public static void logFrame(ProtocolFrame frame, boolean out) { if (LOG.isDebugEnabled()) { LOG.debug(String.format("%1$tH:%1$tM:%1$tS.%1$tL %2$s %3$s\n", new Date(), (out ? "<<<" : ">>>"), frame)); diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ClientModeDebuggerTransport.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ClientModeDebuggerTransport.java index c7816252d837..c6677a6bcfe3 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ClientModeDebuggerTransport.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ClientModeDebuggerTransport.java @@ -17,6 +17,7 @@ import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; /** * {@link DebuggerTransport} implementation that expects a debugging script to behave as a server. The main process of the debugging script @@ -73,10 +74,6 @@ public class ClientModeDebuggerTransport extends BaseDebuggerTransport { "Inappropriate state of Python debugger for connecting to Python debugger: " + myState + "; " + State.INIT + " is expected"); } - doConnect(); - } - - private void doConnect() throws IOException { synchronized (mySocketObject) { if (mySocket != null) { try { @@ -126,6 +123,7 @@ public class ClientModeDebuggerTransport extends BaseDebuggerTransport { beforeHandshake.countDown(); try { myDebugger.handshake(); + myDebuggerReader.connectionApproved(); return true; } catch (PyDebuggerException e) { @@ -194,6 +192,14 @@ public class ClientModeDebuggerTransport extends BaseDebuggerTransport { } } + @Override + protected void onSocketException() { + myDebugger.disconnect(); + if (myState == State.APPROVED) { + myDebugger.fireCommunicationError(); + } + } + @Override public void close() { try { @@ -246,7 +252,12 @@ public class ClientModeDebuggerTransport extends BaseDebuggerTransport { DISCONNECTED } - public class DebuggerReader extends BaseDebuggerReader { + public static class DebuggerReader extends BaseDebuggerReader { + /** + * Indicates that the debugger connection has been approved within this {@link DebuggerReader}. + */ + private final AtomicBoolean myConnectionApproved = new AtomicBoolean(false); + public DebuggerReader(@NotNull RemoteDebugger debugger, @NotNull InputStream stream) throws IOException { super(stream, CharsetToolkit.UTF8_CHARSET, debugger); //TODO: correct encoding? start(getClass().getName()); @@ -254,16 +265,20 @@ public class ClientModeDebuggerTransport extends BaseDebuggerTransport { @Override protected void onExit() { - if (myState == State.APPROVED) { + if (myConnectionApproved.get()) { getDebugger().fireExitEvent(); } } @Override protected void onCommunicationError() { - if (myState == State.APPROVED) { + if (myConnectionApproved.get()) { getDebugger().fireCommunicationError(); } } + + public void connectionApproved() { + myConnectionApproved.set(true); + } } } diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ServerModeDebuggerTransport.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ServerModeDebuggerTransport.java index ccd7b6349081..ef7add81517d 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ServerModeDebuggerTransport.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/transport/ServerModeDebuggerTransport.java @@ -108,6 +108,12 @@ public class ServerModeDebuggerTransport extends BaseDebuggerTransport { } } + @Override + protected void onSocketException() { + myDebugger.disconnect(); + myDebugger.fireCommunicationError(); + } + public static class DebuggerReader extends BaseDebuggerReader { public DebuggerReader(@NotNull RemoteDebugger debugger, @NotNull InputStream stream) throws IOException { super(stream, CharsetToolkit.UTF8_CHARSET, debugger); //TODO: correct encoding?