GP-3512 - Created 'ListenerSet' for improved listener usage

This commit is contained in:
Dan 2023-09-15 15:11:57 -04:00 committed by dragonmacher
parent 41076f3af0
commit 08a900afad
77 changed files with 1669 additions and 1564 deletions

View file

@ -41,7 +41,7 @@ public class JdiEventHandler implements Runnable {
protected final AsyncReference<Integer, JdiCause> state =
new AsyncReference<>(ThreadReference.THREAD_STATUS_NOT_STARTED);
public final ListenerSet<JdiEventsListener> listenersEvent =
new ListenerSet<>(JdiEventsListener.class);
new ListenerSet<>(JdiEventsListener.class, true);
protected final ExecutorService eventThread = Executors.newSingleThreadExecutor();
public JdiEventHandler() {
@ -116,7 +116,7 @@ public class JdiEventHandler implements Runnable {
else if (eventSet.suspendPolicy() == EventRequest.SUSPEND_ALL) {
setCurrentThread(eventSet);
event(
() -> listenersEvent.fire.processStop(eventSet, JdiCause.Causes.UNCLAIMED),
() -> listenersEvent.invoke().processStop(eventSet, JdiCause.Causes.UNCLAIMED),
"processStopped");
}
}
@ -214,7 +214,7 @@ public class JdiEventHandler implements Runnable {
/*
* Inform jdb command line processor that jdb is being shutdown. JDK-8154144.
*/
event(() -> listenersEvent.fire.processShutdown(event, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().processShutdown(event, JdiCause.Causes.UNCLAIMED),
"processStopped");
return null; ///false;
}
@ -301,7 +301,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processBreakpoint(BreakpointEvent evt) {
event(() -> listenersEvent.fire.breakpointHit(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().breakpointHit(evt, JdiCause.Causes.UNCLAIMED),
"breakpointHit");
return DebugStatus.BREAK;
}
@ -314,7 +314,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processException(ExceptionEvent evt) {
event(() -> listenersEvent.fire.exceptionHit(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().exceptionHit(evt, JdiCause.Causes.UNCLAIMED),
"exceptionHit");
return DebugStatus.BREAK;
}
@ -327,7 +327,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMethodEntry(MethodEntryEvent evt) {
event(() -> listenersEvent.fire.methodEntry(evt, JdiCause.Causes.UNCLAIMED), "methodEntry");
event(() -> listenersEvent.invoke().methodEntry(evt, JdiCause.Causes.UNCLAIMED), "methodEntry");
return DebugStatus.GO;
}
@ -339,7 +339,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMethodExit(MethodExitEvent evt) {
event(() -> listenersEvent.fire.methodExit(evt, JdiCause.Causes.UNCLAIMED), "methodExit");
event(() -> listenersEvent.invoke().methodExit(evt, JdiCause.Causes.UNCLAIMED), "methodExit");
return DebugStatus.GO;
}
@ -351,7 +351,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processClassPrepare(ClassPrepareEvent evt) {
event(() -> listenersEvent.fire.classPrepare(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().classPrepare(evt, JdiCause.Causes.UNCLAIMED),
"classPrepare");
/*
if (!Env.specList.resolve(cle)) {
@ -372,7 +372,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processClassUnload(ClassUnloadEvent evt) {
event(() -> listenersEvent.fire.classUnload(evt, JdiCause.Causes.UNCLAIMED), "classUnload");
event(() -> listenersEvent.invoke().classUnload(evt, JdiCause.Causes.UNCLAIMED), "classUnload");
return DebugStatus.GO;
}
@ -384,7 +384,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMCEntered(MonitorContendedEnteredEvent evt) {
event(() -> listenersEvent.fire.monitorContendedEntered(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().monitorContendedEntered(evt, JdiCause.Causes.UNCLAIMED),
"monitorContendedEntered");
return DebugStatus.GO;
}
@ -397,7 +397,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMCEnter(MonitorContendedEnterEvent evt) {
event(() -> listenersEvent.fire.monitorContendedEnter(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().monitorContendedEnter(evt, JdiCause.Causes.UNCLAIMED),
"monitorContendedEnter");
return DebugStatus.GO;
}
@ -410,7 +410,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMonitorWaited(MonitorWaitedEvent evt) {
event(() -> listenersEvent.fire.monitorWaited(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().monitorWaited(evt, JdiCause.Causes.UNCLAIMED),
"monitorWaited");
return DebugStatus.GO;
}
@ -423,7 +423,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processMonitorWait(MonitorWaitEvent evt) {
event(() -> listenersEvent.fire.monitorWait(evt, JdiCause.Causes.UNCLAIMED), "monitorWait");
event(() -> listenersEvent.invoke().monitorWait(evt, JdiCause.Causes.UNCLAIMED), "monitorWait");
return DebugStatus.GO;
}
@ -436,7 +436,7 @@ public class JdiEventHandler implements Runnable {
*/
protected DebugStatus processStep(StepEvent evt) {
evt.request().disable();
event(() -> listenersEvent.fire.stepComplete(evt, JdiCause.Causes.UNCLAIMED), "step");
event(() -> listenersEvent.invoke().stepComplete(evt, JdiCause.Causes.UNCLAIMED), "step");
return DebugStatus.STEP_INTO;
}
@ -448,7 +448,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processWatchpoint(WatchpointEvent evt) {
event(() -> listenersEvent.fire.watchpointHit(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().watchpointHit(evt, JdiCause.Causes.UNCLAIMED),
"watchpointHit");
return DebugStatus.BREAK;
}
@ -461,7 +461,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processAccessWatchpoint(AccessWatchpointEvent evt) {
event(() -> listenersEvent.fire.accessWatchpointHit(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().accessWatchpointHit(evt, JdiCause.Causes.UNCLAIMED),
"accessWatchpointHit");
return DebugStatus.BREAK;
}
@ -474,7 +474,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processWatchpointModification(ModificationWatchpointEvent evt) {
event(() -> listenersEvent.fire.watchpointModified(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().watchpointModified(evt, JdiCause.Causes.UNCLAIMED),
"watchpointModified");
return DebugStatus.GO;
}
@ -487,7 +487,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processThreadDeath(ThreadDeathEvent evt) {
event(() -> listenersEvent.fire.threadExited(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().threadExited(evt, JdiCause.Causes.UNCLAIMED),
"threadExited");
JdiThreadInfo.removeThread(evt.thread());
return DebugStatus.GO;
@ -502,7 +502,7 @@ public class JdiEventHandler implements Runnable {
*/
protected DebugStatus processThreadStart(ThreadStartEvent evt) {
JdiThreadInfo.addThread(evt.thread());
event(() -> listenersEvent.fire.threadStarted(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().threadStarted(evt, JdiCause.Causes.UNCLAIMED),
"threadStarted");
return DebugStatus.GO;
}
@ -516,7 +516,7 @@ public class JdiEventHandler implements Runnable {
*/
protected DebugStatus processVMDeath(VMDeathEvent evt) {
shutdownMessageKey = "The application exited";
event(() -> listenersEvent.fire.vmDied(evt, JdiCause.Causes.UNCLAIMED), "vmDied");
event(() -> listenersEvent.invoke().vmDied(evt, JdiCause.Causes.UNCLAIMED), "vmDied");
return DebugStatus.BREAK;
}
@ -529,7 +529,7 @@ public class JdiEventHandler implements Runnable {
*/
protected DebugStatus processVMDisconnect(VMDisconnectEvent evt) {
shutdownMessageKey = "The application has been disconnected";
event(() -> listenersEvent.fire.vmDisconnected(evt, JdiCause.Causes.UNCLAIMED),
event(() -> listenersEvent.invoke().vmDisconnected(evt, JdiCause.Causes.UNCLAIMED),
"vmDisconnected");
return DebugStatus.BREAK;
}
@ -542,7 +542,7 @@ public class JdiEventHandler implements Runnable {
* @return
*/
protected DebugStatus processVMStart(VMStartEvent evt) {
event(() -> listenersEvent.fire.vmStarted(evt, JdiCause.Causes.UNCLAIMED), "vmStarted");
event(() -> listenersEvent.invoke().vmStarted(evt, JdiCause.Causes.UNCLAIMED), "vmStarted");
return DebugStatus.BREAK;
}

View file

@ -41,9 +41,9 @@ public class JdiManagerImpl implements JdiManager {
private final Map<String, VirtualMachine> unmodifiableVMs = Collections.unmodifiableMap(vms);
protected final ListenerSet<JdiTargetOutputListener> listenersTargetOutput =
new ListenerSet<>(JdiTargetOutputListener.class);
new ListenerSet<>(JdiTargetOutputListener.class, true);
protected final ListenerSet<JdiConsoleOutputListener> listenersConsoleOutput =
new ListenerSet<>(JdiConsoleOutputListener.class);
new ListenerSet<>(JdiConsoleOutputListener.class, true);
protected final ExecutorService eventThread = Executors.newSingleThreadExecutor();
protected JdiEventHandler globalEventHandler = new JdiEventHandler();

View file

@ -15,7 +15,8 @@
*/
package ghidra.dbg.jdi.model;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
@ -26,21 +27,12 @@ import ghidra.dbg.target.TargetBreakpointSpec;
import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.util.datastruct.ListenerMap.ListenerEntry;
import ghidra.util.datastruct.ListenerSet;
@TargetObjectSchemaInfo(
name = "BreakpointSpec",
attributes = {
@TargetAttributeType(
name = TargetBreakpointSpec.CONTAINER_ATTRIBUTE_NAME,
type = JdiModelTargetBreakpointContainer.class),
@TargetAttributeType(
name = TargetBreakpointLocation.SPEC_ATTRIBUTE_NAME,
type = JdiModelTargetBreakpointSpec.class),
@TargetAttributeType(type = Void.class)
},
canonicalContainer = true)
@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = {
@TargetAttributeType(name = TargetBreakpointSpec.CONTAINER_ATTRIBUTE_NAME, type = JdiModelTargetBreakpointContainer.class),
@TargetAttributeType(name = TargetBreakpointLocation.SPEC_ATTRIBUTE_NAME, type = JdiModelTargetBreakpointSpec.class),
@TargetAttributeType(type = Void.class) }, canonicalContainer = true)
public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
implements TargetBreakpointSpec, JdiModelTargetDeletable {
@ -48,12 +40,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
protected TargetBreakpointKindSet kinds;
protected final ListenerSet<TargetBreakpointAction> actions =
new ListenerSet<>(TargetBreakpointAction.class) {
// Use strong references on actions
protected Map<TargetBreakpointAction, ListenerEntry<? extends TargetBreakpointAction>> createMap() {
return new LinkedHashMap<>();
}
};
new ListenerSet<>(TargetBreakpointAction.class, false);
public JdiModelTargetBreakpointSpec(JdiModelTargetBreakpointContainer breakpoints,
JdiBreakpointInfo info, boolean isElement) {

View file

@ -274,7 +274,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen
}
targetVM.vmStateChanged(targetState, reason);
JdiEventHandler eventHandler = getManager().getEventHandler(targetVM.vm);
eventHandler.listenersEvent.fire.threadStateChanged(thread, state,
eventHandler.listenersEvent.invoke().threadStateChanged(thread, state,
JdiCause.Causes.UNCLAIMED, reason);
}