Fixed NPE in multiprocess debug termination (PY-9048).

This commit is contained in:
Dmitry Trofimov
2013-03-04 19:23:34 +01:00
parent 5433c5949a
commit e3aeb19191
3 changed files with 18 additions and 12 deletions
@@ -34,12 +34,12 @@ public class MultiProcessDebugger implements ProcessDebugger {
private final List<RemoteDebugger> myOtherDebuggers = Lists.newArrayList();
private ServerSocket myDebugServerSocket;
private DebuggerProcessAcceptor myDebugProcessAcceptor;
private DebuggerProcessListener myOtherDebuggerCloseListener;
private List<DebuggerProcessListener> 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<String> 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 {
@@ -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
@@ -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<String> threadIds) {
for (PyThreadInfo t : mySuspendedThreads) {