Merge remote-tracking branch 'origin/GP-3162_d-millar_refresh_to_enum'

This commit is contained in:
Ryan Kurtz
2023-03-03 15:39:38 -05:00
116 changed files with 376 additions and 266 deletions
@@ -18,6 +18,7 @@ package agent.dbgeng.model.iface2;
import java.util.concurrent.CompletableFuture;
import agent.dbgeng.manager.DbgModuleMemory;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetMemory;
import ghidra.program.model.address.Address;
@@ -31,6 +32,6 @@ public interface DbgModelTargetMemoryContainer extends DbgModelTargetObject, Tar
@Override
public CompletableFuture<Void> writeMemory(Address address, byte[] data);
public CompletableFuture<Void> requestElements(boolean refresh);
public CompletableFuture<Void> requestElements(RefreshBehavior refresh);
}
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -50,7 +51,7 @@ public class DbgModelTargetAvailableContainerImpl extends DbgModelTargetObjectIm
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listAvailableProcesses().thenAccept(list -> {
List<TargetObject> available;
synchronized (this) {
@@ -25,6 +25,7 @@ import agent.dbgeng.manager.DbgProcess;
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@@ -109,7 +110,7 @@ public class DbgModelTargetBreakpointContainerImpl extends DbgModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
DbgManagerImpl manager = getManager();
return manager.listBreakpoints().thenAccept(byNumber -> {
List<TargetObject> specs;
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointContainer;
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointSpec;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetBreakpointLocation;
import ghidra.dbg.target.TargetBreakpointSpec;
import ghidra.dbg.target.schema.TargetAttributeType;
@@ -163,7 +164,7 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getInfo().thenAccept(i -> {
synchronized (this) {
setBreakpointInfo(i);
@@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.manager.impl.DbgProcessImpl;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.util.datastruct.WeakValueHashMap;
@@ -48,14 +49,14 @@ public class DbgModelTargetEventContainerImpl extends DbgModelTargetObjectImpl
public DbgModelTargetEventContainerImpl(DbgModelTargetDebugContainer debug) {
super(debug.getModel(), debug, "Events", "EventContainer");
this.debug = debug;
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
DbgModelTargetProcess targetProcess = getParentProcess();
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
if (!refresh ||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
return AsyncUtils.NIL;
}
@@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.manager.impl.DbgProcessImpl;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.util.datastruct.WeakValueHashMap;
@@ -48,14 +49,14 @@ public class DbgModelTargetExceptionContainerImpl extends DbgModelTargetObjectIm
public DbgModelTargetExceptionContainerImpl(DbgModelTargetDebugContainer debug) {
super(debug.getModel(), debug, "Exceptions", "ExceptionContainer");
this.debug = debug;
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
DbgModelTargetProcess targetProcess = getParentProcess();
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
if (!refresh ||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
return AsyncUtils.NIL;
}
@@ -28,6 +28,7 @@ import agent.dbgeng.model.iface2.*;
import generic.ULongSpan;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject;
@@ -54,15 +55,15 @@ public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl
super(process.getModel(), process, "Memory", "MemoryContainer");
this.process = process;
if (!getModel().isSuppressDescent()) {
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
DbgModelTargetProcess targetProcess = getParentProcess();
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
if (!refresh ||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
return AsyncUtils.NIL;
}
@@ -22,6 +22,7 @@ import agent.dbgeng.manager.DbgModule;
import agent.dbgeng.manager.DbgProcess;
import agent.dbgeng.model.iface2.DbgModelTargetModule;
import agent.dbgeng.model.iface2.DbgModelTargetModuleContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@@ -49,7 +50,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
this.targetProcess = process;
this.process = process.process;
if (!getModel().isSuppressDescent()) {
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
}
@@ -99,7 +100,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
List<TargetObject> result = new ArrayList<>();
return process.listModules().thenAccept(byName -> {
synchronized (this) {
@@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
import agent.dbgeng.manager.DbgModule;
import agent.dbgeng.manager.DbgModuleSection;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@@ -38,7 +39,7 @@ public class DbgModelTargetModuleSectionContainerImpl extends DbgModelTargetObje
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(null);
/*
return module.listSections().thenAccept(byStart -> {
@@ -26,6 +26,7 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -103,7 +104,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
DbgModelTargetProcess process = getTargetProcess(proc);
DbgModelTargetMemoryContainer memory = process.getMemory();
if (memory != null) {
memory.requestElements(true);
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
}
@@ -116,7 +117,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
}
DbgModelTargetMemoryContainer memory = process.getMemory();
if (memory != null) {
memory.requestElements(true);
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
}
@@ -126,12 +127,12 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
process.getModules().libraryUnloaded(info.toString());
DbgModelTargetMemoryContainer memory = process.getMemory();
if (memory != null) {
memory.requestElements(false);
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
}
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listProcesses().thenAccept(byIID -> {
List<TargetObject> processes;
synchronized (this) {
@@ -24,6 +24,7 @@ import agent.dbgeng.manager.*;
import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.model.iface1.DbgModelTargetFocusScope;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.TargetEventScope.TargetEventType;
import ghidra.dbg.target.schema.*;
@@ -263,9 +264,9 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> resync(boolean refreshAttributes, boolean refreshElements) {
public CompletableFuture<Void> resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements) {
if (memory != null) {
memory.requestElements(true);
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
return super.resync(refreshAttributes, refreshElements);
}
@@ -25,6 +25,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.manager.impl.DbgRegister;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerRegisterAccessException;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetRegisterBank;
@@ -57,7 +58,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
this.thread = thread.getThread();
if (!getModel().isSuppressDescent()) {
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
changeAttributes(List.of(), List.of(), Map.of( //
TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME, this //
), "Initialized");
@@ -65,7 +66,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return thread.listRegisters().thenAccept(regs -> {
if (regs.size() != registersByName.size()) {
DbgModelImpl impl = (DbgModelImpl) model;
@@ -109,7 +110,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
Collection<String> names) {
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
return requestElements(false);
return requestElements(RefreshBehavior.REFRESH_NEVER);
}
return AsyncUtils.NIL;
}).thenCompose(__ -> {
@@ -144,7 +145,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
public CompletableFuture<Void> writeRegistersNamed(Map<String, byte[]> values) {
DbgManagerImpl manager = getManager();
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
return requestElements(false);
return requestElements(RefreshBehavior.REFRESH_NEVER);
}).thenCompose(__ -> {
Map<String, ? extends TargetObject> regs = getCachedElements();
Map<DbgRegister, BigInteger> toWrite = new LinkedHashMap<>();
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import agent.dbgeng.model.iface2.DbgModelTargetSession;
import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributes;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
@TargetObjectSchemaInfo(
@@ -58,7 +59,7 @@ public class DbgModelTargetSessionAttributesImpl extends DbgModelTargetObjectImp
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(null);
}
@@ -23,6 +23,7 @@ import agent.dbgeng.dbgeng.DebugSessionId;
import agent.dbgeng.manager.DbgCause;
import agent.dbgeng.manager.DbgSession;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@@ -65,7 +66,7 @@ public class DbgModelTargetSessionContainerImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(null);
/*
DbgManagerImpl manager = getManager();
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.dbgeng.manager.*;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.util.Msg;
@@ -52,7 +53,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return thread.getThread().listStackFrames().thenAccept(f -> {
List<TargetObject> frames;
synchronized (this) {
@@ -85,7 +86,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
public void threadStateChangedSpecific(DbgState state, DbgReason reason) {
if (!state.equals(DbgState.RUNNING)) {
requestElements(true).exceptionally(e -> {
requestElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
Msg.error(this, "Could not update stack " + this + " on STOPPED");
return null;
});
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.dbgeng.manager.impl.DbgMinimalSymbol;
import agent.dbgeng.model.iface2.DbgModelTargetSymbolContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@@ -45,7 +46,7 @@ public class DbgModelTargetSymbolContainerImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return module.module.listMinimalSymbols().thenAccept(byName -> {
List<TargetObject> symbols;
synchronized (this) {
@@ -26,6 +26,7 @@ import agent.dbgeng.manager.reason.*;
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
import agent.dbgeng.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -53,7 +54,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
getManager().addEventsListener(this);
if (!getModel().isSuppressDescent()) {
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
}
@@ -119,7 +120,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return process.listThreads().thenAccept(byTID -> {
List<TargetObject> threads;
synchronized (this) {
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.Pair;
import agent.dbgeng.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.util.datastruct.WeakValueHashMap;
@@ -36,7 +37,7 @@ public class DbgModel2TargetAvailableContainerImpl extends DbgModel2TargetObject
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listAvailableProcesses().thenAccept(list -> {
List<TargetObject> available;
synchronized (this) {
@@ -49,7 +50,7 @@ public class DbgModel2TargetAvailableContainerImpl extends DbgModel2TargetObject
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
Map<String, Object> nmap = new HashMap<>();
return addModelObjectAttributes(nmap);
}
@@ -52,6 +52,7 @@ import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.TypeKind;
import agent.dbgmodel.manager.DbgManager2Impl;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetAccessConditioned;
import ghidra.dbg.target.TargetAttacher;
@@ -142,11 +143,11 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
@Override
public CompletableFuture<Void> requestAugmentedAttributes() {
return requestAttributes(false);
return requestAttributes(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
List<TargetObject> nlist = new ArrayList<>();
List<String> rlist = new ArrayList<>();
return requestNativeElements().thenCompose(list -> {
@@ -189,7 +190,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
Map<String, Object> nmap = new HashMap<>();
List<String> rlist = new ArrayList<>();
return requestNativeAttributes().thenCompose(map -> {
@@ -236,7 +237,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
if (proxy instanceof TargetStackFrame || //
proxy instanceof TargetModule || //
proxy instanceof TargetBreakpointSpec) {
return delegate.requestAttributes(false);
return delegate.requestAttributes(RefreshBehavior.REFRESH_NEVER);
}
}
return CompletableFuture.completedFuture(null);
@@ -328,7 +329,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
memory = new DbgModelTargetMemoryContainerImpl((DbgModelTargetProcess) proxy);
}
attrs.put(memory.getName(), memory);
memory.requestElements(true);
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
if (proxy instanceof TargetThread) {
DbgModelTargetThread targetThread = (DbgModelTargetThread) proxy;
@@ -394,7 +395,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
if (elements.containsKey(trimKey)) {
return CompletableFuture.completedFuture(elements.get(trimKey));
}
return requestElements(false).thenApply(__ -> getCachedElements().get(trimKey));
return requestElements(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedElements().get(trimKey));
}
}
synchronized (attributes) {
@@ -412,7 +413,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
return obj;
});
}
return requestAttributes(false).thenApply(__ -> getCachedAttribute(key));
return requestAttributes(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedAttribute(key));
}
}
@@ -55,6 +55,7 @@ import agent.dbgmodel.dbgmodel.main.ModelObject;
import agent.dbgmodel.manager.DbgManager2Impl;
import ghidra.async.AsyncUtils;
import ghidra.async.TypeSpec;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetEventScope;
import ghidra.dbg.target.TargetExecutionStateful;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
@@ -227,7 +228,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
stateful.changeAttributes(List.of(), Map.of( //
TargetExecutionStateful.STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE //
), "Selected");
stateful.fetchAttributes(true);
stateful.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS);
}
}
@@ -263,7 +264,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
stateful.changeAttributes(List.of(), Map.of( //
TargetExecutionStateful.STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE //
), "Selected");
stateful.fetchAttributes(true);
stateful.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS);
}
}
@@ -283,7 +284,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
DbgModel2TargetObjectImpl memory =
(DbgModel2TargetObjectImpl) eventProcess.getCachedAttribute("Memory");
memory.requestElements(false);
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
});
});
}
@@ -304,7 +305,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
DbgModel2TargetObjectImpl memory =
(DbgModel2TargetObjectImpl) eventProcess.getCachedAttribute("Memory");
memory.requestElements(false);
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
});
});
}
@@ -642,7 +643,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
DbgManager2Impl manager2 = (DbgManager2Impl) getManager();
List<String> pathX = PathUtils.extend(List.of("Debugger"), path);
intrinsics.put(available.getName(), available);
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import agent.dbgeng.model.iface1.DbgModelTargetInterruptible;
import agent.dbgeng.model.iface2.DbgModelTargetObject;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
public class DbgModel2TargetSystemMarkerImpl extends DbgModel2TargetObjectImpl
implements DbgModelTargetInterruptible {
@@ -32,7 +33,7 @@ public class DbgModel2TargetSystemMarkerImpl extends DbgModel2TargetObjectImpl
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
Map<String, Object> nmap = new HashMap<>();
return addModelObjectAttributes(nmap);
}
@@ -27,6 +27,7 @@ import agent.dbgeng.model.iface1.*;
import agent.dbgeng.model.iface2.*;
import agent.dbgmodel.dbgmodel.main.ModelObject;
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction;
import ghidra.dbg.util.PathUtils;
@@ -320,13 +321,13 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
if (proxy instanceof DbgModelTargetSession || //
proxy instanceof DbgModelTargetProcess || //
proxy instanceof DbgModelTargetThread) {
requestAttributes(false);
requestAttributes(RefreshBehavior.REFRESH_NEVER);
return;
}
if (proxy instanceof DbgModelTargetRegisterContainer || //
proxy instanceof DbgModelTargetRegisterBank || //
proxy.getName().equals("Stack") || proxy.getName().equals("Debug")) {
requestAttributes(false);
requestAttributes(RefreshBehavior.REFRESH_NEVER);
return;
}
if (proxy instanceof DbgModelTargetProcessContainer || //
@@ -334,7 +335,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
proxy instanceof DbgModelTargetModuleContainer || //
proxy instanceof DbgModelTargetBreakpointContainer || //
proxy instanceof DbgModelTargetStack) {
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
return;
}
}
@@ -439,20 +440,20 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
}
if (proxy instanceof TargetRegisterContainer) {
if (!getModel().isSuppressDescent()) {
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
requestAttributes(false);
requestAttributes(RefreshBehavior.REFRESH_NEVER);
}
if (proxy instanceof TargetRegisterBank) {
TargetRegisterBank bank = (TargetRegisterBank) proxy;
// requestElements(false);
requestAttributes(false).thenAccept(__ -> {
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
bank.readRegistersNamed(getCachedAttributes().keySet());
});
}
if (proxy instanceof TargetStack) {
requestAttributes(false);
requestElements(false).thenAccept(__ -> {
requestAttributes(RefreshBehavior.REFRESH_NEVER);
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
for (TargetObject obj : getCachedElements().values()) {
if (obj instanceof TargetStackFrame) {
DbgModelTargetObject frame = (DbgModelTargetObject) obj;
@@ -463,7 +464,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
});
}
if (proxy instanceof TargetStackFrame) {
requestAttributes(false);
requestAttributes(RefreshBehavior.REFRESH_NEVER);
}
}
}
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
import agent.frida.model.iface1.FridaModelTargetConfigurable;
import agent.frida.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -55,7 +56,7 @@ public class FridaModelTargetAvailableDevicesContainerImpl extends FridaModelTar
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listAvailableDevices().thenAccept(list -> {
List<TargetObject> available;
synchronized (this) {
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
import agent.frida.model.iface1.FridaModelTargetConfigurable;
import agent.frida.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -55,7 +56,7 @@ public class FridaModelTargetAvailableProcessesContainerImpl extends FridaModelT
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listAvailableProcesses().thenAccept(list -> {
List<TargetObject> available;
synchronized (this) {
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.frida.manager.FridaExport;
import agent.frida.model.iface2.FridaModelTargetExportContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -47,7 +48,7 @@ public class FridaModelTargetExportContainerImpl extends FridaModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listModuleExports(module.getModule()).thenAccept(byName -> {
List<TargetObject> symbols;
synchronized (this) {
@@ -18,6 +18,7 @@ package agent.frida.model.impl;
import java.util.concurrent.CompletableFuture;
import agent.frida.model.iface2.FridaModelTargetProcess;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@@ -38,7 +39,7 @@ public class FridaModelTargetHeapMemoryContainerImpl extends FridaModelTargetMem
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listHeapMemory(process.getProcess());
}
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.frida.manager.FridaImport;
import agent.frida.model.iface2.FridaModelTargetImportContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -47,7 +48,7 @@ public class FridaModelTargetImportContainerImpl extends FridaModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listModuleImports(module.getModule()).thenAccept(byName -> {
List<TargetObject> symbols;
synchronized (this) {
@@ -27,6 +27,7 @@ import agent.frida.manager.impl.FridaManagerImpl;
import agent.frida.model.iface2.FridaModelTargetMemoryContainer;
import agent.frida.model.iface2.FridaModelTargetMemoryRegion;
import agent.frida.model.methods.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject;
@@ -74,12 +75,12 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
), "Initialized");
getManager().addEventsListener(this);
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listKernelMemory();
@@ -23,6 +23,7 @@ import agent.frida.frida.FridaModuleInfo;
import agent.frida.manager.*;
import agent.frida.model.iface2.FridaModelTargetModule;
import agent.frida.model.iface2.FridaModelTargetModuleContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@@ -48,7 +49,7 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
this.kernel = kernel;
getManager().addEventsListener(this);
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
@@ -112,8 +113,8 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listKernelModules();
@@ -26,6 +26,7 @@ import agent.frida.manager.cmd.FridaWriteMemoryCommand;
import agent.frida.manager.impl.FridaManagerImpl;
import agent.frida.model.iface2.*;
import agent.frida.model.methods.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject;
@@ -76,7 +77,7 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
), "Initialized");
getManager().addEventsListener(this);
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
public FridaModelTargetMemoryContainerImpl(FridaModelTargetProcess process, String name) {
@@ -96,12 +97,12 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
unload.getName(), unload //
), "Initialized");
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listMemory(process.getProcess());
@@ -23,6 +23,7 @@ import agent.frida.frida.FridaModuleInfo;
import agent.frida.manager.*;
import agent.frida.model.iface2.*;
import agent.frida.model.methods.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@@ -66,7 +67,7 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
), "Initialized");
getManager().addEventsListener(this);
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
@Override
@@ -130,8 +131,8 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listModules(session.getProcess());
@@ -25,6 +25,7 @@ import agent.frida.manager.FridaSection;
import agent.frida.model.iface2.FridaModelTargetModule;
import agent.frida.model.iface2.FridaModelTargetModuleSection;
import agent.frida.model.iface2.FridaModelTargetModuleSectionContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -47,11 +48,11 @@ public class FridaModelTargetModuleSectionContainerImpl extends FridaModelTarget
public FridaModelTargetModuleSectionContainerImpl(FridaModelTargetModule module) {
super(module.getModel(), module, "Sections", "ModuleSections");
this.module = module;
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listModuleSections(module.getModule()).thenAccept(byStart -> {
List<TargetObject> sections;
synchronized (this) {
@@ -25,6 +25,7 @@ import agent.frida.manager.*;
import agent.frida.model.iface1.FridaModelTargetConfigurable;
import agent.frida.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -99,7 +100,7 @@ public class FridaModelTargetProcessContainerImpl extends FridaModelTargetObject
*/
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listProcesses(session.getSession()).thenAccept(byIID -> {
List<TargetObject> processes;
synchronized (this) {
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
import agent.frida.manager.*;
import agent.frida.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerRegisterAccessException;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetRegisterBank;
@@ -58,15 +59,15 @@ public class FridaModelTargetRegisterContainerImpl
DISPLAY_ATTRIBUTE_NAME, getName(),
DESCRIPTIONS_ATTRIBUTE_NAME, this), "Initialized");
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
/**
* Does both descriptions and then populates values
*/
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listRegisters(thread.getThread()).thenAccept(registers -> {
@@ -100,7 +101,7 @@ public class FridaModelTargetRegisterContainerImpl
public void threadStateChangedSpecific(FridaState state, FridaReason reason) {
if (state.equals(FridaState.FRIDA_THREAD_STOPPED)) {
requestAttributes(false).thenAccept(__ -> {
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
for (Object attribute : getCachedAttributes().values()) {
if (attribute instanceof FridaModelTargetRegisterBank) {
FridaModelTargetRegisterBank bank =
@@ -21,6 +21,7 @@ import java.util.Map;
import agent.frida.manager.FridaSession;
import agent.frida.model.iface2.FridaModelTargetSession;
import agent.frida.model.iface2.FridaModelTargetSessionAttributes;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
@TargetObjectSchemaInfo(
@@ -51,7 +52,7 @@ public class FridaModelTargetSessionAttributesImpl extends FridaModelTargetObjec
this.platformAttributes = new FridaModelTargetSessionAttributesPlatformImpl(this);
this.environment = new FridaModelTargetSessionAttributesEnvironmentImpl(this);
requestAttributes(false);
requestAttributes(RefreshBehavior.REFRESH_NEVER);
FridaSession s = (FridaSession) session.getModelObject();
changeAttributes(List.of(), List.of( //
@@ -25,6 +25,7 @@ import agent.frida.manager.FridaSession;
import agent.frida.model.iface2.FridaModelTargetRoot;
import agent.frida.model.iface2.FridaModelTargetSession;
import agent.frida.model.iface2.FridaModelTargetSessionContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -77,7 +78,7 @@ public class FridaModelTargetSessionContainerImpl extends FridaModelTargetObject
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listSessions().thenAccept(byIID -> {
List<TargetObject> sessions;
synchronized (this) {
@@ -27,6 +27,7 @@ import agent.frida.model.iface2.FridaModelTargetProcess;
import agent.frida.model.iface2.FridaModelTargetStack;
import agent.frida.model.iface2.FridaModelTargetStackFrame;
import agent.frida.model.iface2.FridaModelTargetThread;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -57,11 +58,11 @@ public class FridaModelTargetStackImpl extends FridaModelTargetObjectImpl
public FridaModelTargetStackImpl(FridaModelTargetThread thread, FridaModelTargetProcess process) {
super(thread.getModel(), thread, NAME, "Stack");
this.thread = thread;
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listStackFrames(thread.getThread()).thenAccept(f -> {
List<TargetObject> frames;
synchronized (this) {
@@ -85,7 +86,7 @@ public class FridaModelTargetStackImpl extends FridaModelTargetObjectImpl
public void threadStateChangedSpecific(FridaState state, FridaReason reason) {
if (state.equals(FridaState.FRIDA_THREAD_STOPPED)) {
requestElements(true).thenAccept(__ -> {
requestElements(RefreshBehavior.REFRESH_ALWAYS).thenAccept(__ -> {
for (TargetObject element : getCachedElements().values()) {
if (element instanceof FridaModelTargetStackFrame) {
FridaModelTargetStackFrameImpl frame =
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import agent.frida.manager.FridaSymbol;
import agent.frida.model.iface2.FridaModelTargetSymbolContainer;
import agent.frida.model.methods.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
@@ -61,7 +62,7 @@ public class FridaModelTargetSymbolContainerImpl extends FridaModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listModuleSymbols(module.getModule()).thenAccept(byName -> {
List<TargetObject> symbols;
synchronized (this) {
@@ -25,6 +25,7 @@ import agent.frida.model.iface1.FridaModelTargetConfigurable;
import agent.frida.model.iface2.*;
import agent.frida.model.methods.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
import ghidra.dbg.target.TargetObject;
@@ -131,8 +132,8 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
broadcast().invalidateCacheRequested(this);
}
return getManager().listThreads(process);
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.GdbProcessThreadGroup;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
@@ -51,7 +52,7 @@ public class GdbModelTargetAvailableContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return impl.gdb.listAvailableProcesses().thenAccept(list -> {
List<GdbModelTargetAttachable> available;
synchronized (this) {
@@ -27,6 +27,7 @@ import agent.gdb.manager.breakpoint.GdbBreakpointType;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import ghidra.async.AsyncFence;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
import ghidra.dbg.target.TargetBreakpointSpecContainer;
@@ -179,8 +180,8 @@ public class GdbModelTargetBreakpointContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (!refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
return updateUsingBreakpoints(impl.gdb.getKnownBreakpoints());
}
return impl.gdb.listBreakpoints().thenCompose(this::updateUsingBreakpoints);
@@ -21,6 +21,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.breakpoint.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetBreakpointSpec;
import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet;
@@ -134,8 +135,8 @@ public class GdbModelTargetBreakpointSpec extends
actions.remove(action);
}
protected CompletableFuture<GdbBreakpointInfo> getInfo(boolean refresh) {
if (!refresh) {
protected CompletableFuture<GdbBreakpointInfo> getInfo(RefreshBehavior refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
return CompletableFuture.completedFuture(impl.gdb.getKnownBreakpoints().get(number));
}
return impl.gdb.listBreakpoints()
@@ -143,7 +144,7 @@ public class GdbModelTargetBreakpointSpec extends
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getInfo(refresh).thenCompose(i -> {
return updateInfo(info, i, "Refreshed");
});
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.*;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
@@ -136,8 +137,8 @@ public class GdbModelTargetInferiorContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (!refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
updateUsingInferiors(impl.gdb.getKnownInferiors());
return AsyncUtils.NIL;
}
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import agent.gdb.manager.GdbInferior;
import agent.gdb.manager.GdbModule;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.TargetObject;
@@ -83,7 +84,7 @@ public class GdbModelTargetModule extends
}
public CompletableFuture<Void> init() {
return sections.requestElements(true).exceptionally(ex -> {
return sections.requestElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(ex -> {
impl.reportError(this, "Could not initialize module sections and base", ex);
return null;
});
@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.GdbInferior;
import agent.gdb.manager.GdbModule;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerUserException;
import ghidra.dbg.target.*;
@@ -99,7 +100,7 @@ public class GdbModelTargetModuleContainer
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
return doRefresh();
}
@@ -30,6 +30,7 @@ import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import generic.ULongSpan;
import ghidra.async.AsyncFence;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.target.TargetMemory;
@@ -118,7 +119,7 @@ public class GdbModelTargetProcessMemory
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// Can't use refresh getKnownMappings is only populated by listMappings
return doRefresh();
}
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.*;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetRegisterContainer;
import ghidra.dbg.target.schema.TargetAttributeType;
@@ -53,8 +54,8 @@ public class GdbModelTargetRegisterContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (!refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
return completeUsingThreads(inferior.getKnownThreads());
}
return doRefresh();
@@ -96,7 +97,7 @@ public class GdbModelTargetRegisterContainer
}
public void stateChanged(GdbStateChangeRecord sco) {
requestElements(false).thenAccept(__ -> {
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
for (GdbModelTargetRegister modelRegister : registersByNumber.values()) {
modelRegister.stateChanged(sco);
}
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import agent.gdb.manager.GdbModuleSection;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetSectionContainer;
@@ -60,7 +61,7 @@ public class GdbModelTargetSectionContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// getKnownSections is not guaranteed to be populated
// listSections is cached by manager, so just use it always
return module.module.listSections().thenAccept(this::updateUsingSections);
@@ -24,6 +24,7 @@ import agent.gdb.manager.GdbStackFrame;
import agent.gdb.manager.GdbThread;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetStack;
import ghidra.dbg.target.schema.TargetAttributeType;
@@ -53,7 +54,7 @@ public class GdbModelTargetStack extends
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return thread.listStackFrames().thenAccept(f -> {
List<GdbModelTargetStackFrame> frames;
synchronized (this) {
@@ -92,7 +93,7 @@ public class GdbModelTargetStack extends
* target. Thus, every time we're STOPPED, this method should be called.
*/
public CompletableFuture<Void> stateChanged(GdbStateChangeRecord sco) {
return requestElements(true).thenCompose(__ -> {
return requestElements(RefreshBehavior.REFRESH_ALWAYS).thenCompose(__ -> {
GdbModelTargetStackFrame innermost = framesByLevel.get(0);
if (innermost != null) {
return innermost.stateChanged(sco);
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import agent.gdb.manager.GdbRegister;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerRegisterAccessException;
import ghidra.dbg.target.TargetRegisterBank;
@@ -126,7 +127,7 @@ public class GdbModelTargetStackFrameRegisterContainer
* Does both descriptions and then populates values
*/
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// NB. GDB manager caches these per thread
return ensureRegisterDescriptions().thenCompose(regs -> {
if (!regs.isEmpty()) {
@@ -180,12 +181,12 @@ public class GdbModelTargetStackFrameRegisterContainer
}).thenCompose(__ -> {
return updateRegisterValues(toWrite.keySet());
}).thenCompose(__ -> {
return frame.getParent().fetchElements(true);
return frame.getParent().fetchElements(RefreshBehavior.REFRESH_ALWAYS);
})).thenApply(__ -> null);
}
public CompletableFuture<Void> stateChanged(GdbStateChangeRecord sco) {
return requestElements(false).exceptionally(ex -> {
return requestElements(RefreshBehavior.REFRESH_NEVER).exceptionally(ex -> {
if (!valid) {
Msg.info(this,
"Ignoring error when refreshing now-invalid thread registers: " + ex);

Some files were not shown because too many files have changed in this diff Show More