GP-0: Fix deadlock btw/ Trace & Platform Managers

This commit is contained in:
Dan 2022-11-04 15:44:37 -04:00
parent 1333ac6a0c
commit 52472d90a7

View file

@ -486,25 +486,25 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
return coordinates; return coordinates;
} }
TracePlatform platform = TracePlatform platform =
getPlatformForMapper(current.getTrace(), current.getObject(), mapper); getPlatformForMapper(coordinates.getTrace(), coordinates.getObject(), mapper);
return coordinates.platform(platform); return coordinates.platform(platform);
} }
protected DebuggerCoordinates doSetCurrent(DebuggerCoordinates newCurrent) { protected DebuggerCoordinates doSetCurrent(DebuggerCoordinates newCurrent) {
newCurrent = newCurrent == null ? DebuggerCoordinates.NOWHERE : newCurrent; newCurrent = newCurrent == null ? DebuggerCoordinates.NOWHERE : newCurrent;
newCurrent = fillInRecorder(newCurrent.getTrace(), newCurrent);
newCurrent = fillInPlatform(newCurrent);
synchronized (listenersByTrace) { synchronized (listenersByTrace) {
DebuggerCoordinates resolved = fillInRecorder(newCurrent.getTrace(), newCurrent); if (current.equals(newCurrent)) {
if (current.equals(resolved)) {
return null; return null;
} }
resolved = fillInPlatform(resolved); current = newCurrent;
current = resolved; if (newCurrent.getTrace() != null) {
contextChanged(); lastCoordsByTrace.put(newCurrent.getTrace(), newCurrent);
if (resolved.getTrace() != null) {
lastCoordsByTrace.put(resolved.getTrace(), resolved);
} }
return resolved;
} }
contextChanged();
return newCurrent;
} }
protected void contextChanged() { protected void contextChanged() {
@ -610,9 +610,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
public void processEvent(PluginEvent event) { public void processEvent(PluginEvent event) {
super.processEvent(event); super.processEvent(event);
if (event instanceof TraceActivatedPluginEvent ev) { if (event instanceof TraceActivatedPluginEvent ev) {
synchronized (listenersByTrace) { doSetCurrent(ev.getActiveCoordinates());
doSetCurrent(ev.getActiveCoordinates());
}
} }
else if (event instanceof TraceClosedPluginEvent ev) { else if (event instanceof TraceClosedPluginEvent ev) {
doTraceClosed(ev.getTrace()); doTraceClosed(ev.getTrace());
@ -1048,10 +1046,16 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
boolean syncTargetFocus) { boolean syncTargetFocus) {
DebuggerCoordinates prev; DebuggerCoordinates prev;
DebuggerCoordinates resolved; DebuggerCoordinates resolved;
Trace newTrace = coordinates.getTrace();
synchronized (listenersByTrace) { synchronized (listenersByTrace) {
prev = current; if (newTrace != null && !listenersByTrace.containsKey(newTrace)) {
resolved = doSetCurrent(coordinates); throw new IllegalStateException(
"Trace must be opened before activated: " + newTrace);
}
} }
prev = current;
resolved = doSetCurrent(coordinates);
if (resolved == null) { if (resolved == null) {
return AsyncUtils.NIL; return AsyncUtils.NIL;
} }