diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/MultiProcessDebugger.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/MultiProcessDebugger.java index acc16205c7e1..94572fc88bd3 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/MultiProcessDebugger.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/MultiProcessDebugger.java @@ -34,12 +34,12 @@ public class MultiProcessDebugger implements ProcessDebugger { private final List myOtherDebuggers = Lists.newArrayList(); private ServerSocket myDebugServerSocket; private DebuggerProcessAcceptor myDebugProcessAcceptor; - private DebuggerProcessListener myOtherDebuggerCloseListener; + private List myOtherDebuggerCloseListener = Lists.newArrayList(); private ThreadRegistry myThreadRegistry = new ThreadRegistry(); - public MultiProcessDebugger(final IPyDebugProcess debugProcess, - final ServerSocket serverSocket, + public MultiProcessDebugger(@NotNull final IPyDebugProcess debugProcess, + @NotNull final ServerSocket serverSocket, final int timeoutInMillis) { myDebugProcess = debugProcess; @@ -357,7 +357,7 @@ public class MultiProcessDebugger implements ProcessDebugger { private static class DebuggerProcessAcceptor implements Runnable { private volatile boolean myShouldAccept = true; - private MultiProcessDebugger myMultiProcessDebugger; + private final MultiProcessDebugger myMultiProcessDebugger; private ServerSocket myServerSocket; public DebuggerProcessAcceptor(@NotNull MultiProcessDebugger multiProcessDebugger, @NotNull ServerSocket serverSocket) { @@ -406,7 +406,7 @@ public class MultiProcessDebugger implements ProcessDebugger { } } - private void addCloseListener(final RemoteDebugger debugger) { + private void addCloseListener(@NotNull final RemoteDebugger debugger) { debugger.addCloseListener(new RemoteDebuggerCloseListener() { @Override public void closed() { @@ -426,7 +426,9 @@ public class MultiProcessDebugger implements ProcessDebugger { } private void notifyThreadsClosed(RemoteDebugger debugger) { - myMultiProcessDebugger.myOtherDebuggerCloseListener.threadsClosed(collectThreads(debugger)); + for (DebuggerProcessListener l : myMultiProcessDebugger.myOtherDebuggerCloseListener) { + l.threadsClosed(collectThreads(debugger)); + } } private Set collectThreads(RemoteDebugger debugger) { @@ -449,7 +451,6 @@ public class MultiProcessDebugger implements ProcessDebugger { } myServerSocket = null; } - myMultiProcessDebugger = null; } } @@ -486,8 +487,8 @@ public class MultiProcessDebugger implements ProcessDebugger { myMainDebugger.removeCloseListener(listener); } - public void setOtherDebuggerCloseListener(DebuggerProcessListener otherDebuggerCloseListener) { - this.myOtherDebuggerCloseListener = otherDebuggerCloseListener; + public void addOtherDebuggerCloseListener(DebuggerProcessListener otherDebuggerCloseListener) { + myOtherDebuggerCloseListener.add(otherDebuggerCloseListener); } public interface DebuggerProcessListener { diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java index 557a44995abd..714cbeed3621 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/RemoteDebugger.java @@ -40,7 +40,10 @@ public class RemoteDebugger implements ProcessDebugger { private static final int CONNECTION_TIMEOUT = 60000; private final IPyDebugProcess myDebugProcess; + + @NotNull private final ServerSocket myServerSocket; + private final int myTimeout; private final Object mySocketObject = new Object(); // for synchronization on socket private Socket mySocket; @@ -75,8 +78,10 @@ public class RemoteDebugger implements ProcessDebugger { try { //noinspection SocketOpenedButNotSafelyClosed myServerSocket.setSoTimeout(CONNECTION_TIMEOUT); - mySocket = myServerSocket.accept(); - myConnected = true; + synchronized (mySocketObject) { + mySocket = myServerSocket.accept(); + myConnected = true; + } } finally { //it is closed in close() method on process termination diff --git a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java index 2748b24664fe..370179157849 100644 --- a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java +++ b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java @@ -127,7 +127,7 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr private MultiProcessDebugger createMultiprocessDebugger(ServerSocket serverSocket) { MultiProcessDebugger debugger = new MultiProcessDebugger(this, serverSocket, 10000); - debugger.setOtherDebuggerCloseListener(new MultiProcessDebugger.DebuggerProcessListener() { + debugger.addOtherDebuggerCloseListener(new MultiProcessDebugger.DebuggerProcessListener() { @Override public void threadsClosed(Set threadIds) { for (PyThreadInfo t : mySuspendedThreads) {