mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fixed NPE in multiprocess debug termination (PY-9048).
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user