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

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