GP-3162: refresh bool->enum

This commit is contained in:
d-millar 2023-03-03 18:41:18 +00:00
parent a9baf9f6d8
commit 15c4345d71
116 changed files with 376 additions and 266 deletions

View file

@ -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);
}

View file

@ -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) {

View file

@ -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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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) {

View file

@ -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 -> {

View file

@ -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) {

View file

@ -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);
}

View file

@ -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<>();

View file

@ -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);
}

View file

@ -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();

View file

@ -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;
});

View file

@ -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) {

View file

@ -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) {

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
}
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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());
}

View file

@ -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) {

View file

@ -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();

View file

@ -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();

View file

@ -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());

View file

@ -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());

View file

@ -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) {

View file

@ -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) {

View file

@ -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 =

View file

@ -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( //

View file

@ -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) {

View file

@ -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 =

View file

@ -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) {

View file

@ -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);

View file

@ -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) {

View file

@ -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);

View file

@ -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");
});

View file

@ -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;
}

View file

@ -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;
});

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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);
}

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import agent.gdb.manager.impl.GdbMinimalSymbol;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetSymbolNamespace;
@ -48,7 +49,7 @@ public class GdbModelTargetSymbolContainer
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return module.module.listMinimalSymbols().thenAccept(byName -> {
List<GdbModelTargetSymbol> symbols;
synchronized (this) {

View file

@ -25,6 +25,7 @@ import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import agent.gdb.manager.reason.GdbBreakpointHitReason;
import ghidra.async.AsyncFence;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
import ghidra.dbg.target.TargetConfigurable;
@ -90,8 +91,8 @@ public class GdbModelTargetThreadContainer
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
if (!refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
updateUsingThreads(inferior.getKnownThreads());
return AsyncUtils.NIL;
}
@ -136,7 +137,7 @@ public class GdbModelTargetThreadContainer
if (sco.getState() != GdbState.STOPPED) {
return updateThreadStates(sco);
}
return requestElements(false).thenCompose(__ -> {
return requestElements(RefreshBehavior.REFRESH_NEVER).thenCompose(__ -> {
return updateThreadStates(sco);
}).exceptionally(__ -> {
Msg.error(this, "Could not update threads " + this + " on STOPPED");

View file

@ -23,6 +23,7 @@ import SWIG.SBTarget;
import agent.lldb.lldb.DebugClient;
import agent.lldb.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.util.PathUtils;
@ -126,10 +127,10 @@ public abstract class LldbModelTargetAbstractXpointSpec extends LldbModelTargetO
actions.remove(action);
}
protected CompletableFuture<Object> getInfo(boolean refresh) {
protected CompletableFuture<Object> getInfo(RefreshBehavior refresh) {
SBTarget session = getManager().getCurrentSession();
String id = DebugClient.getId(getModelObject());
if (!refresh) {
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
return CompletableFuture
.completedFuture(getManager().getKnownBreakpoints(session).get(id));
}
@ -138,7 +139,7 @@ public abstract class LldbModelTargetAbstractXpointSpec extends LldbModelTargetO
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getInfo(refresh).thenAccept(i -> {
updateInfo(i, "Refreshed");
});

View file

@ -23,17 +23,14 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.Pair;
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
import agent.lldb.model.iface2.LldbModelTargetAvailable;
import agent.lldb.model.iface2.LldbModelTargetAvailableContainer;
import agent.lldb.model.iface2.LldbModelTargetRoot;
import agent.lldb.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;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.util.datastruct.WeakValueHashMap;
@TargetObjectSchemaInfo(
@ -59,7 +56,7 @@ public class LldbModelTargetAvailableContainerImpl extends LldbModelTargetObject
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listAvailableProcesses().thenAccept(list -> {
List<TargetObject> available;
synchronized (this) {

View file

@ -25,6 +25,7 @@ import SWIG.*;
import agent.lldb.lldb.DebugClient;
import agent.lldb.manager.LldbCause;
import agent.lldb.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@ -137,7 +138,7 @@ public class LldbModelTargetBreakpointContainerImpl extends LldbModelTargetObjec
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listBreakpoints(getSession()).thenAccept(byNumber -> {
List<TargetObject> specs;
synchronized (this) {

View file

@ -21,6 +21,7 @@ import java.util.Map;
import SWIG.SBBreakpointLocation;
import SWIG.SBTarget;
import agent.lldb.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@ -44,7 +45,7 @@ public class LldbModelTargetBreakpointLocationContainerImpl extends LldbModelTar
this.targetProcess = (LldbModelTargetProcessImpl) targetProcess;
getManager().addEventsListener(this);
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
public LldbModelTargetBreakpointLocation getTargetBreakpointLocation(SBBreakpointLocation loc) {

View file

@ -25,6 +25,7 @@ import agent.lldb.manager.cmd.LldbReadMemoryCommand;
import agent.lldb.manager.cmd.LldbWriteMemoryCommand;
import agent.lldb.manager.impl.LldbManagerImpl;
import agent.lldb.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject;
@ -54,11 +55,11 @@ public class LldbModelTargetMemoryContainerImpl extends LldbModelTargetObjectImp
public LldbModelTargetMemoryContainerImpl(LldbModelTargetProcess process) {
super(process.getModel(), process, "Memory", "MemoryContainer");
this.process = process;
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listMemory(process.getProcess()).thenAccept(byName -> {
List<TargetObject> regions;
synchronized (this) {

View file

@ -22,6 +22,7 @@ import SWIG.*;
import agent.lldb.lldb.DebugModuleInfo;
import agent.lldb.model.iface2.LldbModelTargetModule;
import agent.lldb.model.iface2.LldbModelTargetModuleContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -47,7 +48,7 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
super(session.getModel(), session, "Modules", "ModuleContainer");
this.targetSession = session;
this.session = session.getSession();
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
@ -103,7 +104,7 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listModules(session).thenAccept(byName -> {
List<LldbModelTargetModule> result = new ArrayList<>();
synchronized (this) {

View file

@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import SWIG.SBModule;
import SWIG.SBSection;
import agent.lldb.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.program.model.address.Address;
@ -43,11 +44,11 @@ public class LldbModelTargetModuleSectionContainerImpl extends LldbModelTargetOb
public LldbModelTargetModuleSectionContainerImpl(LldbModelTargetModule 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) {

View file

@ -28,12 +28,11 @@ import agent.lldb.manager.LldbReason;
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
import agent.lldb.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;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.dbg.target.schema.*;
@TargetObjectSchemaInfo(
name = "ProcessContainer",
@ -143,7 +142,7 @@ public class LldbModelTargetProcessContainerImpl extends LldbModelTargetObjectIm
}
@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) {

View file

@ -28,6 +28,7 @@ import agent.lldb.manager.impl.LldbManagerImpl;
import agent.lldb.model.iface1.LldbModelTargetFocusScope;
import agent.lldb.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.*;
import ghidra.dbg.target.TargetEventScope.TargetEventType;
import ghidra.dbg.target.schema.*;
@ -151,10 +152,10 @@ public class LldbModelTargetProcessImpl extends LldbModelTargetObjectImpl
TargetExecutionState targetState = DebugClient.convertState(state);
setExecutionState(targetState, "ThreadStateChanged");
if (state.equals(StateType.eStateStopped)) {
threads.requestElements(true);
threads.requestElements(RefreshBehavior.REFRESH_ALWAYS);
StopReason stopReason = getManager().getCurrentThread().GetStopReason();
if (!stopReason.equals(StopReason.eStopReasonPlanComplete)) {
memory.requestElements(true);
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
}
}

View file

@ -23,9 +23,8 @@ import SWIG.ByteOrder;
import SWIG.SBTarget;
import agent.lldb.model.iface2.LldbModelTargetSession;
import agent.lldb.model.iface2.LldbModelTargetSessionAttributes;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
@TargetObjectSchemaInfo(
name = "SessionAttributes",
@ -91,7 +90,7 @@ public class LldbModelTargetSessionAttributesImpl extends LldbModelTargetObjectI
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(null);
}

View file

@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import SWIG.SBTarget;
import agent.lldb.manager.LldbCause;
import agent.lldb.model.iface2.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
@ -73,7 +74,7 @@ public class LldbModelTargetSessionContainerImpl extends LldbModelTargetObjectIm
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listSessions().thenAccept(byIID -> {
List<TargetObject> sessions;
synchronized (this) {

View file

@ -16,28 +16,21 @@
package agent.lldb.model.impl;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import SWIG.SBStream;
import SWIG.SBValue;
import SWIG.StateType;
import SWIG.*;
import agent.lldb.manager.LldbReason;
import agent.lldb.model.iface2.LldbModelTargetRegister;
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterBank;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerRegisterAccessException;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.dbg.util.PathUtils;
import ghidra.util.Msg;
@TargetObjectSchemaInfo(
name = "RegisterValueBank",
@ -69,7 +62,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
DISPLAY_ATTRIBUTE_NAME, getName(),
DESCRIPTIONS_ATTRIBUTE_NAME, container), "Initialized");
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
@Override
@ -84,7 +77,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
* Does both descriptions and then populates values
*/
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
SBValue bank = (SBValue) getModelObject();
return getManager().listStackFrameRegisters(bank).thenAccept(regs -> {
if (regs.isEmpty()) {
@ -118,7 +111,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
@Override
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
if (state.equals(StateType.eStateStopped)) {
requestElements(false).thenAccept(__ -> {
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
readRegistersNamed(getCachedElements().keySet());
});
}

View file

@ -28,6 +28,7 @@ import agent.lldb.model.iface2.LldbModelTargetObject;
import agent.lldb.model.iface2.LldbModelTargetRegisterBank;
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterBank;
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterContainer;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -57,14 +58,14 @@ public class LldbModelTargetStackFrameRegisterContainerImpl
public LldbModelTargetStackFrameRegisterContainerImpl(LldbModelTargetStackFrameImpl frame) {
super(frame.getModel(), frame, NAME, "StackFrameRegisterContainer");
this.frame = frame;
requestAttributes(true);
requestAttributes(RefreshBehavior.REFRESH_ALWAYS);
}
/**
* Does both descriptions and then populates values
*/
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
return getManager().listStackFrameRegisterBanks(frame.getFrame()).thenAccept(banks -> {
if (banks.isEmpty()) {
return;
@ -93,7 +94,7 @@ public class LldbModelTargetStackFrameRegisterContainerImpl
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
if (state.equals(StateType.eStateStopped)) {
requestAttributes(false).thenAccept(__ -> {
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
for (Object attribute : getCachedAttributes().values()) {
if (attribute instanceof LldbModelTargetRegisterBank) {
LldbModelTargetRegisterBank bank = (LldbModelTargetRegisterBank) attribute;

View file

@ -24,7 +24,7 @@ import SWIG.SBFrame;
import SWIG.StateType;
import agent.lldb.manager.LldbReason;
import agent.lldb.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -53,11 +53,11 @@ public class LldbModelTargetStackImpl extends LldbModelTargetObjectImpl
public LldbModelTargetStackImpl(LldbModelTargetThread thread, LldbModelTargetProcess 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 -> {
if (f.isEmpty()) {
return;
@ -84,7 +84,7 @@ public class LldbModelTargetStackImpl extends LldbModelTargetObjectImpl
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
if (state.equals(StateType.eStateStopped)) {
requestElements(true).thenAccept(__ -> {
requestElements(RefreshBehavior.REFRESH_ALWAYS).thenAccept(__ -> {
for (TargetObject element : getCachedElements().values()) {
if (element instanceof LldbModelTargetStackFrame) {
LldbModelTargetStackFrameImpl frame =

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import SWIG.SBSymbol;
import agent.lldb.model.iface2.LldbModelTargetSymbolContainer;
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 LldbModelTargetSymbolContainerImpl extends LldbModelTargetObjectImp
}
@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) {

View file

@ -27,6 +27,7 @@ import agent.lldb.manager.LldbReason;
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
import agent.lldb.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 LldbModelTargetThreadContainerImpl extends LldbModelTargetObjectImp
this.changeAttributes(List.of(), Map.of(BASE_ATTRIBUTE_NAME, 16), "Initialized");
getManager().addEventsListener(this);
requestElements(false);
requestElements(RefreshBehavior.REFRESH_NEVER);
}
@Override
@ -130,7 +131,7 @@ public class LldbModelTargetThreadContainerImpl extends LldbModelTargetObjectImp
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getManager().listThreads(process).thenAccept(byTID -> {
List<TargetObject> threads;
synchronized (this) {

View file

@ -22,6 +22,7 @@ import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.gadp.GadpRegistry;
import ghidra.dbg.gadp.client.annot.GadpEventHandler;
@ -185,22 +186,22 @@ public class DelegateGadpClientTargetObject
}
@Override
public CompletableFuture<Void> resync(boolean attributes, boolean elements) {
public CompletableFuture<Void> resync(RefreshBehavior attributes, RefreshBehavior elements) {
return client.sendChecked(Gadp.ResyncRequest.newBuilder()
.setPath(GadpValueUtils.makePath(path))
.setAttributes(attributes)
.setElements(elements),
.setAttributes(attributes.equals(RefreshBehavior.REFRESH_ALWAYS))
.setElements(elements.equals(RefreshBehavior.REFRESH_ALWAYS)),
Gadp.ResyncReply.getDefaultInstance()).thenApply(rep -> null);
}
@Override
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
return resync(refresh, false);
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
return resync(refresh, RefreshBehavior.REFRESH_NEVER);
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
return resync(false, refresh);
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return resync(RefreshBehavior.REFRESH_NEVER, refresh);
}
@Override

View file

@ -27,6 +27,7 @@ import ghidra.async.TypeSpec;
import ghidra.comm.service.AbstractAsyncClientHandler;
import ghidra.dbg.DebuggerModelListener;
import ghidra.dbg.DebuggerObjectModel;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.*;
import ghidra.dbg.gadp.GadpVersion;
import ghidra.dbg.gadp.client.GadpValueUtils;
@ -509,7 +510,11 @@ public class GadpClientHandler
List<String> path = req.getPath().getEList();
return model.fetchModelObject(path).thenCompose(obj -> {
DebuggerObjectModel.requireNonNull(obj, path);
return obj.resync(req.getAttributes(), req.getElements());
RefreshBehavior reqAttributes = req.getAttributes() ?
RefreshBehavior.REFRESH_ALWAYS : RefreshBehavior.REFRESH_NEVER;
RefreshBehavior reqElements = req.getElements() ?
RefreshBehavior.REFRESH_ALWAYS : RefreshBehavior.REFRESH_NEVER;
return obj.resync(reqAttributes, reqElements);
}).thenCompose(__ -> {
return model.flushEvents();
}).thenCompose(__ -> {

View file

@ -38,6 +38,7 @@ import generic.ID;
import generic.Unique;
import ghidra.async.*;
import ghidra.dbg.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.*;
import ghidra.dbg.attributes.TargetStringList;
import ghidra.dbg.error.DebuggerIllegalArgumentException;
@ -337,8 +338,8 @@ public class GadpClientServerTest implements AsyncTestUtils {
}
@Override
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
if (refresh) {
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
List<String> toRemove = new ArrayList<>();
for (String name : attributes.keySet()) {
if (PathUtils.isInvocation(name)) {
@ -513,7 +514,7 @@ public class GadpClientServerTest implements AsyncTestUtils {
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
setElements(List.of(new TestGadpTargetAvailable(this, 1, "echo"),
new TestGadpTargetAvailable(this, 2, "dd")), Map.of(), "Refreshed");
return super.requestElements(refresh);
@ -839,7 +840,7 @@ public class GadpClientServerTest implements AsyncTestUtils {
assertEquals(0, invocations.count.get().intValue());
// Flush the cache
waitOn(avail.fetchAttributes(true));
waitOn(avail.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS));
CompletableFuture<?> future2 = avail.fetchAttribute("greet(World)");
waitOn(invocations.count.waitValue(1));
TestMethodInvocation invocation2 = invocations.poll();

View file

@ -21,12 +21,13 @@ import java.util.stream.Collectors;
import com.sun.jdi.Location;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.JdiCause;
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.TargetBreakpointSpecContainer;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
import ghidra.dbg.target.TargetBreakpointSpecContainer;
import ghidra.dbg.target.schema.*;
import ghidra.program.model.address.AddressRange;
import ghidra.util.datastruct.WeakValueHashMap;
@ -142,7 +143,7 @@ public class JdiModelTargetBreakpointContainer extends JdiModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(null);
}
}

View file

@ -18,6 +18,7 @@ package ghidra.dbg.jdi.model;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
import ghidra.dbg.jdi.model.iface1.JdiModelTargetDeletable;
import ghidra.dbg.target.TargetBreakpointLocation;
@ -104,7 +105,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
actions.remove(action);
}
protected CompletableFuture<JdiBreakpointInfo> getInfo(boolean refresh) {
protected CompletableFuture<JdiBreakpointInfo> getInfo(RefreshBehavior refresh) {
return CompletableFuture.completedFuture(info);
}
@ -126,7 +127,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return getInfo(refresh).thenCompose(i -> {
return updateInfo(info, i, "Refreshed");
});

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.ReferenceType;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
import ghidra.util.Msg;
@ -45,7 +46,7 @@ public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
super(vm, "Classes");
this.vm = vm;
requestElements(true);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
protected CompletableFuture<Void> updateUsingClasses(Map<String, ReferenceType> byName) {
@ -64,7 +65,7 @@ public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
return doRefresh();
}

View file

@ -23,6 +23,7 @@ import com.sun.jdi.VirtualMachineManager;
import com.sun.jdi.connect.Connector;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
import ghidra.util.Msg;
@ -64,7 +65,7 @@ public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl {
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
return doRefresh();
}

View file

@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetMemoryRegion;
import ghidra.dbg.target.TargetSection;
import ghidra.dbg.target.schema.*;
@ -59,7 +60,7 @@ public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl impleme
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.range = impl.getAddressRange(getClassType(), pool.length);
if (range != null) {

View file

@ -22,6 +22,7 @@ import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.Field;
import com.sun.jdi.request.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -78,7 +79,7 @@ public class JdiModelTargetField extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.declaringType = (JdiModelTargetReferenceType) getInstance(field.declaringType());
populateAttributes();

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.Field;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -66,7 +67,7 @@ public class JdiModelTargetFieldContainer extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, Field> map = new HashMap<>();
List<Field> fields = useAll ? reftype.reftype.allFields() : reftype.reftype.fields();
for (Field f : fields) {

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.LocalVariable;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
@TargetObjectSchemaInfo(
@ -63,7 +64,7 @@ public class JdiModelTargetLocalVariable extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
populateAttributes();

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.LocalVariable;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -63,7 +64,7 @@ public class JdiModelTargetLocalVariableContainer extends JdiModelTargetObjectIm
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, LocalVariable> map = new HashMap<>();
try {
for (LocalVariable var : vars) {

View file

@ -24,6 +24,7 @@ import com.sun.jdi.Location;
import com.sun.jdi.request.BreakpointRequest;
import com.sun.jdi.request.EventRequestManager;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -72,7 +73,7 @@ public class JdiModelTargetLocation extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.declaringType = (JdiModelTargetReferenceType) getInstance(location.declaringType());

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.Location;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -63,7 +64,7 @@ public class JdiModelTargetLocationContainer extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, Location> map = new HashMap<>();
if (locations != null) {
for (Location loc : locations) {

View file

@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -84,7 +85,7 @@ public class JdiModelTargetMethod extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
populateAttributes();

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.Method;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -64,7 +65,7 @@ public class JdiModelTargetMethodContainer extends JdiModelTargetObjectImpl {
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, Method> map = new HashMap<>();
List<Method> methods = useAll ? reftype.reftype.allMethods() : reftype.reftype.methods();
for (Method var : methods) {

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.ModuleReference;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.error.DebuggerUserException;
import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.TargetModuleContainer;
@ -100,7 +101,7 @@ public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return doRefresh();
}

View file

@ -22,6 +22,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.Mirror;
import com.sun.jdi.ThreadReference;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.agent.DefaultTargetObject;
import ghidra.dbg.jdi.manager.JdiCause;
import ghidra.dbg.jdi.manager.JdiStateListener;
@ -158,8 +159,8 @@ public class JdiModelTargetObjectImpl extends
Map<String, ?> existingAttributes = getCachedAttributes();
Boolean autoupdate = (Boolean) existingAttributes.get("autoupdate");
if (autoupdate != null && autoupdate) {
requestAttributes(true);
requestElements(true);
requestAttributes(RefreshBehavior.REFRESH_ALWAYS);
requestElements(RefreshBehavior.REFRESH_ALWAYS);
}
}

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -60,7 +61,7 @@ public class JdiModelTargetObjectReference extends JdiModelTargetValue {
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.referenceType = (JdiModelTargetReferenceType) getInstance(objref.referenceType());

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.ObjectReference;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -66,7 +67,7 @@ public class JdiModelTargetObjectReferenceContainer extends JdiModelTargetObject
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, ObjectReference> map = new HashMap<>();
for (ObjectReference ref : refs) {
map.put(ref.toString(), ref);

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.*;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.schema.*;
@ -113,7 +114,7 @@ public class JdiModelTargetReferenceType extends JdiModelTargetType implements T
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.allFields = new JdiModelTargetFieldContainer(this, true);
this.allMethods = new JdiModelTargetMethodContainer(this, true);

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.Location;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.TargetRegister;
import ghidra.dbg.target.schema.*;
@ -55,7 +56,7 @@ public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
changeAttributes(List.of(), List.of(), Map.of( //
DISPLAY_ATTRIBUTE_NAME, getDisplay() //

View file

@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.Location;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetRegisterBank;
import ghidra.dbg.target.TargetRegisterContainer;
import ghidra.dbg.target.schema.*;
@ -136,7 +137,7 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
}
protected CompletableFuture<?> update() {
return fetchElements(true).exceptionally(e -> {
return fetchElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
Msg.error(this, "Could not update registers " + this + " on STOPPED");
return null;
});

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.Method;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetMemoryRegion;
import ghidra.dbg.target.TargetSection;
import ghidra.dbg.target.schema.*;
@ -70,7 +71,7 @@ public class JdiModelTargetSection extends JdiModelTargetObjectImpl implements /
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.range = method == null ? impl.defaultRange : impl.getAddressRange(method);
if (range != null) {

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.Method;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetMemory;
import ghidra.dbg.target.schema.*;
import ghidra.program.model.address.Address;
@ -56,7 +57,7 @@ public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl
}
@Override
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
constantPool = new JdiModelTargetConstantPool(this, reftype.reftype.constantPool(), false);
changeAttributes(List.of(), List.of( //
@ -67,7 +68,7 @@ public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
updateUsingSections(reftype.reftype.methods());
return CompletableFuture.completedFuture(null);
}

View file

@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.target.TargetStack;
import ghidra.dbg.target.schema.*;
import ghidra.util.Msg;
@ -49,7 +50,7 @@ public class JdiModelTargetStack extends JdiModelTargetObjectImpl
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
List<JdiModelTargetStackFrame> targetFrames = new ArrayList<>();
List<StackFrame> frames;
try {
@ -103,7 +104,7 @@ public class JdiModelTargetStack extends JdiModelTargetObjectImpl
* @return null
*/
protected CompletableFuture<?> update() {
return fetchElements(true).exceptionally(e -> {
return fetchElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
Msg.error(this, "Could not update stack " + this + " on STOPPED");
return null;
});

View file

@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
import com.sun.jdi.*;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.JdiCause;
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
import ghidra.dbg.jdi.model.iface1.JdiModelSelectableObject;
@ -75,7 +76,7 @@ public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl implement
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
//this.arguments = new JdiModelTargetValueContainer(this, "Arguments", frame.getArgumentValues());

View file

@ -24,6 +24,7 @@ import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.StepRequest;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.*;
import ghidra.dbg.jdi.model.iface1.*;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
@ -124,7 +125,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
populateAttributes();

View file

@ -23,6 +23,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.ThreadReference;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.*;
import ghidra.dbg.jdi.model.iface1.JdiModelTargetEventScope;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
@ -118,7 +119,7 @@ public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
return updateUsingThreads(threads);
}

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.ThreadGroupReference;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
@ -61,7 +62,7 @@ public class JdiModelTargetThreadGroupContainer extends JdiModelTargetObjectImpl
}
@Override
protected CompletableFuture<Void> requestElements(boolean refresh) {
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
List<ThreadGroupReference> groups;
if (parent instanceof JdiModelTargetVM) {
JdiModelTargetVM vm = (JdiModelTargetVM) parent;

View file

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
import com.sun.jdi.Type;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
@ -64,7 +65,7 @@ public class JdiModelTargetTypeContainer extends JdiModelTargetObjectImpl {
}
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
Map<String, Type> map = new HashMap<>();
try {
for (Type type : types) {

View file

@ -27,6 +27,7 @@ import com.sun.jdi.event.*;
import com.sun.jdi.request.*;
import ghidra.async.AsyncFence;
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
import ghidra.dbg.jdi.manager.*;
import ghidra.dbg.jdi.manager.impl.JdiManagerImpl;
import ghidra.dbg.jdi.model.iface1.*;
@ -191,7 +192,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements //
}
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
this.threadGroups = new JdiModelTargetThreadGroupContainer(this);
this.modules = new JdiModelTargetModuleContainer(this);

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