From 15c4345d71bc9dac581dbe2e1a2dc663899b742a Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Fri, 3 Mar 2023 18:41:18 +0000 Subject: [PATCH] GP-3162: refresh bool->enum --- .../iface2/DbgModelTargetMemoryContainer.java | 3 ++- .../DbgModelTargetAvailableContainerImpl.java | 3 ++- ...DbgModelTargetBreakpointContainerImpl.java | 3 ++- .../DbgModelTargetBreakpointSpecImpl.java | 3 ++- .../DbgModelTargetEventContainerImpl.java | 7 +++--- .../DbgModelTargetExceptionContainerImpl.java | 7 +++--- .../DbgModelTargetMemoryContainerImpl.java | 7 +++--- .../DbgModelTargetModuleContainerImpl.java | 5 ++-- ...ModelTargetModuleSectionContainerImpl.java | 3 ++- .../DbgModelTargetProcessContainerImpl.java | 9 ++++--- .../model/impl/DbgModelTargetProcessImpl.java | 5 ++-- .../DbgModelTargetRegisterContainerImpl.java | 9 ++++--- .../DbgModelTargetSessionAttributesImpl.java | 3 ++- .../DbgModelTargetSessionContainerImpl.java | 3 ++- .../model/impl/DbgModelTargetStackImpl.java | 5 ++-- .../DbgModelTargetSymbolContainerImpl.java | 3 ++- .../DbgModelTargetThreadContainerImpl.java | 5 ++-- ...DbgModel2TargetAvailableContainerImpl.java | 5 ++-- .../model/impl/DbgModel2TargetObjectImpl.java | 15 +++++------ .../model/impl/DbgModel2TargetRootImpl.java | 11 ++++---- .../impl/DbgModel2TargetSystemMarkerImpl.java | 3 ++- .../impl/DelegateDbgModel2TargetObject.java | 19 +++++++------- ...elTargetAvailableDevicesContainerImpl.java | 3 ++- ...TargetAvailableProcessesContainerImpl.java | 3 ++- .../FridaModelTargetExportContainerImpl.java | 3 ++- ...idaModelTargetHeapMemoryContainerImpl.java | 3 ++- .../FridaModelTargetImportContainerImpl.java | 3 ++- ...aModelTargetKernelMemoryContainerImpl.java | 7 +++--- ...aModelTargetKernelModuleContainerImpl.java | 7 +++--- .../FridaModelTargetMemoryContainerImpl.java | 9 ++++--- .../FridaModelTargetModuleContainerImpl.java | 7 +++--- ...ModelTargetModuleSectionContainerImpl.java | 5 ++-- .../FridaModelTargetProcessContainerImpl.java | 3 ++- ...FridaModelTargetRegisterContainerImpl.java | 9 ++++--- ...FridaModelTargetSessionAttributesImpl.java | 3 ++- .../FridaModelTargetSessionContainerImpl.java | 3 ++- .../model/impl/FridaModelTargetStackImpl.java | 7 +++--- .../FridaModelTargetSymbolContainerImpl.java | 3 ++- .../FridaModelTargetThreadContainerImpl.java | 5 ++-- .../GdbModelTargetAvailableContainer.java | 3 ++- .../GdbModelTargetBreakpointContainer.java | 5 ++-- .../impl/GdbModelTargetBreakpointSpec.java | 7 +++--- .../impl/GdbModelTargetInferiorContainer.java | 5 ++-- .../gdb/model/impl/GdbModelTargetModule.java | 3 ++- .../impl/GdbModelTargetModuleContainer.java | 3 ++- .../impl/GdbModelTargetProcessMemory.java | 3 ++- .../impl/GdbModelTargetRegisterContainer.java | 7 +++--- .../impl/GdbModelTargetSectionContainer.java | 3 ++- .../gdb/model/impl/GdbModelTargetStack.java | 5 ++-- ...odelTargetStackFrameRegisterContainer.java | 7 +++--- .../impl/GdbModelTargetSymbolContainer.java | 3 ++- .../impl/GdbModelTargetThreadContainer.java | 7 +++--- .../LldbModelTargetAbstractXpointSpec.java | 7 +++--- ...LldbModelTargetAvailableContainerImpl.java | 11 +++----- ...ldbModelTargetBreakpointContainerImpl.java | 3 ++- ...TargetBreakpointLocationContainerImpl.java | 3 ++- .../LldbModelTargetMemoryContainerImpl.java | 5 ++-- .../LldbModelTargetModuleContainerImpl.java | 5 ++-- ...ModelTargetModuleSectionContainerImpl.java | 5 ++-- .../LldbModelTargetProcessContainerImpl.java | 7 +++--- .../impl/LldbModelTargetProcessImpl.java | 5 ++-- .../LldbModelTargetSessionAttributesImpl.java | 7 +++--- .../LldbModelTargetSessionContainerImpl.java | 3 ++- ...ModelTargetStackFrameRegisterBankImpl.java | 21 ++++++---------- ...TargetStackFrameRegisterContainerImpl.java | 7 +++--- .../model/impl/LldbModelTargetStackImpl.java | 8 +++--- .../LldbModelTargetSymbolContainerImpl.java | 3 ++- .../LldbModelTargetThreadContainerImpl.java | 5 ++-- .../DelegateGadpClientTargetObject.java | 15 +++++------ .../dbg/gadp/server/GadpClientHandler.java | 7 +++++- .../ghidra/dbg/gadp/GadpClientServerTest.java | 9 ++++--- .../JdiModelTargetBreakpointContainer.java | 5 ++-- .../model/JdiModelTargetBreakpointSpec.java | 5 ++-- .../model/JdiModelTargetClassContainer.java | 5 ++-- .../JdiModelTargetConnectorContainer.java | 3 ++- .../jdi/model/JdiModelTargetConstantPool.java | 3 ++- .../dbg/jdi/model/JdiModelTargetField.java | 3 ++- .../model/JdiModelTargetFieldContainer.java | 3 ++- .../model/JdiModelTargetLocalVariable.java | 3 ++- .../JdiModelTargetLocalVariableContainer.java | 3 ++- .../dbg/jdi/model/JdiModelTargetLocation.java | 3 ++- .../JdiModelTargetLocationContainer.java | 3 ++- .../dbg/jdi/model/JdiModelTargetMethod.java | 3 ++- .../model/JdiModelTargetMethodContainer.java | 3 ++- .../model/JdiModelTargetModuleContainer.java | 3 ++- .../jdi/model/JdiModelTargetObjectImpl.java | 5 ++-- .../model/JdiModelTargetObjectReference.java | 3 ++- ...diModelTargetObjectReferenceContainer.java | 3 ++- .../model/JdiModelTargetReferenceType.java | 3 ++- .../dbg/jdi/model/JdiModelTargetRegister.java | 3 ++- .../JdiModelTargetRegisterContainer.java | 3 ++- .../dbg/jdi/model/JdiModelTargetSection.java | 3 ++- .../model/JdiModelTargetSectionContainer.java | 5 ++-- .../dbg/jdi/model/JdiModelTargetStack.java | 5 ++-- .../jdi/model/JdiModelTargetStackFrame.java | 3 ++- .../dbg/jdi/model/JdiModelTargetThread.java | 3 ++- .../model/JdiModelTargetThreadContainer.java | 3 ++- .../JdiModelTargetThreadGroupContainer.java | 3 ++- .../model/JdiModelTargetTypeContainer.java | 3 ++- .../dbg/jdi/model/JdiModelTargetVM.java | 3 ++- .../jdi/model/JdiModelTargetVMContainer.java | 5 ++-- .../model/JdiModelTargetValueContainer.java | 3 ++- .../dbg/jdi/model/JdiModelTargetValueMap.java | 3 ++- .../RefreshRegistersScript.java | 5 ++-- .../gui/objects/DebuggerObjectsProvider.java | 3 ++- .../debug/gui/objects/ObjectContainer.java | 3 ++- .../objects/components/DummyTargetObject.java | 3 ++- .../objects/components/ObjectElementRow.java | 3 ++- .../debug/flatapi/FlatDebuggerAPITest.java | 13 +++++----- .../java/ghidra/dbg/DebuggerObjectModel.java | 20 ++++++++++----- .../ghidra/dbg/agent/DefaultTargetObject.java | 25 ++++++++++--------- .../dbg/agent/SpiDebuggerObjectModel.java | 9 ++++--- .../java/ghidra/dbg/target/TargetObject.java | 21 ++++++++-------- .../target/schema/AnnotatedSchemaContext.java | 3 ++- .../AnnotatedTargetObjectSchemaTest.java | 5 ++-- .../dbg/testutil/DebuggerModelTestUtils.java | 3 ++- 116 files changed, 376 insertions(+), 266 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java index c50be82369..51faa2821c 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java @@ -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 writeMemory(Address address, byte[] data); - public CompletableFuture requestElements(boolean refresh); + public CompletableFuture requestElements(RefreshBehavior refresh); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableContainerImpl.java index 1c9a1fdf0d..c1d8dbdafb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listAvailableProcesses().thenAccept(list -> { List available; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java index 5a2c9afe4c..6737f66d07 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { DbgManagerImpl manager = getManager(); return manager.listBreakpoints().thenAccept(byNumber -> { List specs; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java index cc939739cc..36d5930e07 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getInfo().thenAccept(i -> { synchronized (this) { setBreakpointInfo(i); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventContainerImpl.java index e24eee767d..894a0c44e7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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; } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionContainerImpl.java index b6b7deff76..f3456353b6 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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; } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java index 143de6b324..35144ddfa5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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; } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java index b369f0f93d..d229d432cf 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { List result = new ArrayList<>(); return process.listModules().thenAccept(byName -> { synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionContainerImpl.java index 796e8ea99c..fef32a4785 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return CompletableFuture.completedFuture(null); /* return module.listSections().thenAccept(byStart -> { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java index 775ae6f641..b446afd92f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listProcesses().thenAccept(byIID -> { List processes; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessImpl.java index eca72ea5da..719cde64c2 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessImpl.java @@ -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 resync(boolean refreshAttributes, boolean refreshElements) { + public CompletableFuture resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements) { if (memory != null) { - memory.requestElements(true); + memory.requestElements(RefreshBehavior.REFRESH_ALWAYS); } return super.resync(refreshAttributes, refreshElements); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java index 7ff2e5742f..05c962192f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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 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 writeRegistersNamed(Map values) { DbgManagerImpl manager = getManager(); return model.gateFuture(thread.listRegisters().thenCompose(regs -> { - return requestElements(false); + return requestElements(RefreshBehavior.REFRESH_NEVER); }).thenCompose(__ -> { Map regs = getCachedElements(); Map toWrite = new LinkedHashMap<>(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionAttributesImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionAttributesImpl.java index f77852ffd4..28395e0ba7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionAttributesImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionAttributesImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return CompletableFuture.completedFuture(null); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionContainerImpl.java index ae2f3ed5b1..300ae9b8ea 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return CompletableFuture.completedFuture(null); /* DbgManagerImpl manager = getManager(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java index 9281f7ce18..95444f21f4 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return thread.getThread().listStackFrames().thenAccept(f -> { List 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; }); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolContainerImpl.java index f8208ab44f..9b5bd8ee6c 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return module.module.listMinimalSymbols().thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadContainerImpl.java index c224e733fd..d983430648 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return process.listThreads().thenAccept(byTID -> { List threads; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetAvailableContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetAvailableContainerImpl.java index a28c0059d0..a98e58222a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetAvailableContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetAvailableContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listAvailableProcesses().thenAccept(list -> { List available; synchronized (this) { @@ -49,7 +50,7 @@ public class DbgModel2TargetAvailableContainerImpl extends DbgModel2TargetObject } @Override - public CompletableFuture requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { Map nmap = new HashMap<>(); return addModelObjectAttributes(nmap); } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java index 3c5b9d8e5d..8e960d457c 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java @@ -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 requestAugmentedAttributes() { - return requestAttributes(false); + return requestAttributes(RefreshBehavior.REFRESH_NEVER); } @Override - public CompletableFuture requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { List nlist = new ArrayList<>(); List rlist = new ArrayList<>(); return requestNativeElements().thenCompose(list -> { @@ -189,7 +190,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { Map nmap = new HashMap<>(); List rlist = new ArrayList<>(); return requestNativeAttributes().thenCompose(map -> { @@ -236,7 +237,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject getCachedElements().get(trimKey)); + return requestElements(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedElements().get(trimKey)); } } synchronized (attributes) { @@ -412,7 +413,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject getCachedAttribute(key)); + return requestAttributes(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedAttribute(key)); } } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetRootImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetRootImpl.java index b9830ac8f2..d28fc0caf8 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetRootImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetRootImpl.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { DbgManager2Impl manager2 = (DbgManager2Impl) getManager(); List pathX = PathUtils.extend(List.of("Debugger"), path); intrinsics.put(available.getName(), available); diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java index f213a792f1..a1364e8b66 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { Map nmap = new HashMap<>(); return addModelObjectAttributes(nmap); } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java index 3a16489a14..4c64f277e4 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java @@ -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); } } } diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableDevicesContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableDevicesContainerImpl.java index ea23d2c9a7..5c87a1242c 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableDevicesContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableDevicesContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listAvailableDevices().thenAccept(list -> { List available; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableProcessesContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableProcessesContainerImpl.java index 0eb751deef..7f424ada5c 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableProcessesContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetAvailableProcessesContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listAvailableProcesses().thenAccept(list -> { List available; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetExportContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetExportContainerImpl.java index a200e42b6f..b9c8b80933 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetExportContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetExportContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleExports(module.getModule()).thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetHeapMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetHeapMemoryContainerImpl.java index f8199881fd..6451634487 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetHeapMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetHeapMemoryContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listHeapMemory(process.getProcess()); } diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetImportContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetImportContainerImpl.java index 2832a5e0d3..bdde165dab 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetImportContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetImportContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleImports(module.getModule()).thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelMemoryContainerImpl.java index 15343c74b8..b767269956 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelMemoryContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { broadcast().invalidateCacheRequested(this); } return getManager().listKernelMemory(); diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelModuleContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelModuleContainerImpl.java index 2d3aa54d3b..876d225ac0 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelModuleContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetKernelModuleContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { broadcast().invalidateCacheRequested(this); } return getManager().listKernelModules(); diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetMemoryContainerImpl.java index 9fe20eeff1..177d6482fc 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetMemoryContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { broadcast().invalidateCacheRequested(this); } return getManager().listMemory(process.getProcess()); diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleContainerImpl.java index 79d9170f93..4e4a0131a2 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { broadcast().invalidateCacheRequested(this); } return getManager().listModules(session.getProcess()); diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleSectionContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleSectionContainerImpl.java index ce210d0711..1bc27084ac 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleSectionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetModuleSectionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleSections(module.getModule()).thenAccept(byStart -> { List sections; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetProcessContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetProcessContainerImpl.java index 68bd459e8d..a0fdcfa9e8 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetProcessContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetProcessContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listProcesses(session.getSession()).thenAccept(byIID -> { List processes; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetRegisterContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetRegisterContainerImpl.java index 16e71d5224..9637837a20 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetRegisterContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetRegisterContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture 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 = diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionAttributesImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionAttributesImpl.java index 422202b38f..52aa4ca399 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionAttributesImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionAttributesImpl.java @@ -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( // diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionContainerImpl.java index 80a6da159f..f298c7f150 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSessionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listSessions().thenAccept(byIID -> { List sessions; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetStackImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetStackImpl.java index 99d36fa42f..55ae720100 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetStackImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetStackImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listStackFrames(thread.getThread()).thenAccept(f -> { List 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 = diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSymbolContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSymbolContainerImpl.java index 373abcb58f..c5ac77263f 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSymbolContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetSymbolContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleSymbols(module.getModule()).thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetThreadContainerImpl.java b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetThreadContainerImpl.java index 1c33a68ca1..6cc9aa6928 100644 --- a/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetThreadContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-frida/src/main/java/agent/frida/model/impl/FridaModelTargetThreadContainerImpl.java @@ -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 requestElements(boolean refresh) { - if (refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { broadcast().invalidateCacheRequested(this); } return getManager().listThreads(process); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java index dbec3f15d3..865b2097c4 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return impl.gdb.listAvailableProcesses().thenAccept(list -> { List available; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java index 95bd9a4742..8c4fd2e74a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java @@ -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 requestElements(boolean refresh) { - if (!refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { return updateUsingBreakpoints(impl.gdb.getKnownBreakpoints()); } return impl.gdb.listBreakpoints().thenCompose(this::updateUsingBreakpoints); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java index c011cb71a6..6fcc168a9f 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java @@ -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 getInfo(boolean refresh) { - if (!refresh) { + protected CompletableFuture 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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getInfo(refresh).thenCompose(i -> { return updateInfo(info, i, "Refreshed"); }); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferiorContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferiorContainer.java index 83cb80bade..7a726c2901 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferiorContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferiorContainer.java @@ -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 requestElements(boolean refresh) { - if (!refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { updateUsingInferiors(impl.gdb.getKnownInferiors()); return AsyncUtils.NIL; } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java index 58dd958d71..e572e84b3d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java @@ -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 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; }); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java index 8ddf366ea0..156c65bc62 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { // Ignore 'refresh' because inferior.getKnownModules may exclude executable return doRefresh(); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java index b6e08b9091..22fafea46a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { // Can't use refresh getKnownMappings is only populated by listMappings return doRefresh(); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java index dff3084ef1..356ca0042d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java @@ -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 requestElements(boolean refresh) { - if (!refresh) { + public CompletableFuture 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); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java index 6f81d384e4..c24f88d4c4 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java index 1a8f3a96de..9f481cc95c 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return thread.listStackFrames().thenAccept(f -> { List 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 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); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrameRegisterContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrameRegisterContainer.java index 0579e3fcc6..eb216c5805 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrameRegisterContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrameRegisterContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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 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); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java index 0e4465b0af..9f1c77623a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return module.module.listMinimalSymbols().thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java index a39e0be160..5d4f6b9671 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java @@ -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 requestElements(boolean refresh) { - if (!refresh) { + protected CompletableFuture 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"); diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAbstractXpointSpec.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAbstractXpointSpec.java index f89de3ce7a..f2c926076a 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAbstractXpointSpec.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAbstractXpointSpec.java @@ -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 getInfo(boolean refresh) { + protected CompletableFuture 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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getInfo(refresh).thenAccept(i -> { updateInfo(i, "Refreshed"); }); diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAvailableContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAvailableContainerImpl.java index 667961fa2d..63706131f0 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAvailableContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetAvailableContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listAvailableProcesses().thenAccept(list -> { List available; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointContainerImpl.java index 3428d562b0..ed89a524bc 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listBreakpoints(getSession()).thenAccept(byNumber -> { List specs; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationContainerImpl.java index 42da93aa91..b0b6c0337d 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationContainerImpl.java @@ -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) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetMemoryContainerImpl.java index 7ac40ba1ee..d3d5a9ea5a 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetMemoryContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listMemory(process.getProcess()).thenAccept(byName -> { List regions; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleContainerImpl.java index 514491ca6f..ca25ceebbd 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModules(session).thenAccept(byName -> { List result = new ArrayList<>(); synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleSectionContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleSectionContainerImpl.java index 228c4b019c..3c0f7428f6 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleSectionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetModuleSectionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleSections(module.getModule()).thenAccept(byStart -> { List sections; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessContainerImpl.java index fbb56c6d24..c31f6d24d1 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listProcesses(session.getSession()).thenAccept(byIID -> { List processes; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessImpl.java index 9c48ff8004..67abf73807 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetProcessImpl.java @@ -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); } } } diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionAttributesImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionAttributesImpl.java index e67b7720ff..4cc1e1ad67 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionAttributesImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionAttributesImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return CompletableFuture.completedFuture(null); } diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionContainerImpl.java index f28c521034..77ec843f2c 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSessionContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listSessions().thenAccept(byIID -> { List sessions; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterBankImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterBankImpl.java index bda724b4bf..6cc5b7a5f3 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterBankImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterBankImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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()); }); } diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterContainerImpl.java index 6066947bcf..33cf92367e 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackFrameRegisterContainerImpl.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture 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; diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackImpl.java index 239928bc42..761ac35198 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetStackImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture 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 = diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolContainerImpl.java index 5f32f5e4de..2129105286 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listModuleSymbols(module.getModule()).thenAccept(byName -> { List symbols; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetThreadContainerImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetThreadContainerImpl.java index f81708554a..d4fb06cfd6 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetThreadContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetThreadContainerImpl.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getManager().listThreads(process).thenAccept(byTID -> { List threads; synchronized (this) { diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java index 6f28c69992..ed1c99da9b 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java @@ -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 resync(boolean attributes, boolean elements) { + public CompletableFuture 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 requestAttributes(boolean refresh) { - return resync(refresh, false); + protected CompletableFuture requestAttributes(RefreshBehavior refresh) { + return resync(refresh, RefreshBehavior.REFRESH_NEVER); } @Override - protected CompletableFuture requestElements(boolean refresh) { - return resync(false, refresh); + protected CompletableFuture requestElements(RefreshBehavior refresh) { + return resync(RefreshBehavior.REFRESH_NEVER, refresh); } @Override diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java index 6ffd3d882e..718e0a33e6 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java @@ -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 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(__ -> { diff --git a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java index 870a1277e6..952d7eb494 100644 --- a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java +++ b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java @@ -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 requestAttributes(boolean refresh) { - if (refresh) { + protected CompletableFuture requestAttributes(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { List toRemove = new ArrayList<>(); for (String name : attributes.keySet()) { if (PathUtils.isInvocation(name)) { @@ -513,7 +514,7 @@ public class GadpClientServerTest implements AsyncTestUtils { } @Override - public CompletableFuture requestElements(boolean refresh) { + public CompletableFuture 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(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java index bc94ad9c44..7906701964 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return CompletableFuture.completedFuture(null); } } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java index 399d38c934..c6833282f2 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java @@ -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 getInfo(boolean refresh) { + protected CompletableFuture getInfo(RefreshBehavior refresh) { return CompletableFuture.completedFuture(info); } @@ -126,7 +127,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl } @Override - public CompletableFuture requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { return getInfo(refresh).thenCompose(i -> { return updateInfo(info, i, "Refreshed"); }); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java index 6bbe627932..5e292d3986 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java @@ -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 updateUsingClasses(Map byName) { @@ -64,7 +65,7 @@ public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl { } @Override - protected CompletableFuture requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { // Ignore 'refresh' because inferior.getKnownModules may exclude executable return doRefresh(); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java index a355f45b9b..aba6e07903 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { // Ignore 'refresh' because inferior.getKnownModules may exclude executable return doRefresh(); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java index 0646277be3..3aa0ba7b58 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.range = impl.getAddressRange(getClassType(), pool.length); if (range != null) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java index bd345f99d0..bb22b42972 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.declaringType = (JdiModelTargetReferenceType) getInstance(field.declaringType()); populateAttributes(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java index dc06affded..12e622972f 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); List fields = useAll ? reftype.reftype.allFields() : reftype.reftype.fields(); for (Field f : fields) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java index a89400d53c..5a982d849e 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { populateAttributes(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java index c1ce69b681..25bbb4efdc 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); try { for (LocalVariable var : vars) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java index 2b4cedd44a..b0d9a05541 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.declaringType = (JdiModelTargetReferenceType) getInstance(location.declaringType()); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java index 0da50507bc..fb7c801da5 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); if (locations != null) { for (Location loc : locations) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java index d5d85d49e1..fd75e1fa86 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { populateAttributes(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java index 6065963478..cbf623a86e 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); List methods = useAll ? reftype.reftype.allMethods() : reftype.reftype.methods(); for (Method var : methods) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java index 7638084452..be832bf063 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { return doRefresh(); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java index 6b346ea09f..53c4a69e72 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java @@ -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 existingAttributes = getCachedAttributes(); Boolean autoupdate = (Boolean) existingAttributes.get("autoupdate"); if (autoupdate != null && autoupdate) { - requestAttributes(true); - requestElements(true); + requestAttributes(RefreshBehavior.REFRESH_ALWAYS); + requestElements(RefreshBehavior.REFRESH_ALWAYS); } } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java index c3e34143eb..a3d07840af 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.referenceType = (JdiModelTargetReferenceType) getInstance(objref.referenceType()); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java index a7675e3f57..7b75acc866 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); for (ObjectReference ref : refs) { map.put(ref.toString(), ref); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java index 8833ced9f0..abfdc9fdbb 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.allFields = new JdiModelTargetFieldContainer(this, true); this.allMethods = new JdiModelTargetMethodContainer(this, true); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java index bf4a40c84b..1afe5082ba 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { changeAttributes(List.of(), List.of(), Map.of( // DISPLAY_ATTRIBUTE_NAME, getDisplay() // diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java index aa7a67f63f..28cf34b231 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java @@ -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; }); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java index 8ee917c73b..5518d138fb 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.range = method == null ? impl.defaultRange : impl.getAddressRange(method); if (range != null) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java index fa64bcfc69..4f1435cb9d 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java @@ -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 requestAttributes(boolean refresh) { + protected CompletableFuture 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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { updateUsingSections(reftype.reftype.methods()); return CompletableFuture.completedFuture(null); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java index 16440ec731..f213624caf 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { List targetFrames = new ArrayList<>(); List 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; }); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java index cf25dddc98..0c0b4254f4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { //this.arguments = new JdiModelTargetValueContainer(this, "Arguments", frame.getArgumentValues()); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java index 02e8cfeffa..02c9681df4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { populateAttributes(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java index 835c2a5720..e4a863fd4d 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { return updateUsingThreads(threads); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java index 2e55f4a336..4ebebdf0c4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java @@ -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 requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { List groups; if (parent instanceof JdiModelTargetVM) { JdiModelTargetVM vm = (JdiModelTargetVM) parent; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java index 5e15cb7ecd..3fd97eba58 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java @@ -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 requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); try { for (Type type : types) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java index e10e2a589a..7f38c8c5ea 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java @@ -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 requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { this.threadGroups = new JdiModelTargetThreadGroupContainer(this); this.modules = new JdiModelTargetModuleContainer(this); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java index 89ec15229a..9de043c78d 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java @@ -24,6 +24,7 @@ import com.sun.jdi.VirtualMachine; import com.sun.jdi.event.*; import ghidra.async.AsyncUtils; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.jdi.manager.JdiCause; import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.target.TargetEventScope.TargetEventType; @@ -151,8 +152,8 @@ public class JdiModelTargetVMContainer extends JdiModelTargetObjectImpl } @Override - public CompletableFuture requestElements(boolean refresh) { - if (!refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { + if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { updateUsingVMs(impl.getManager().getKnownVMs()); return AsyncUtils.NIL; } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java index adad690032..a43183dcf4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import com.sun.jdi.Value; 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 JdiModelTargetValueContainer extends JdiModelTargetObjectImpl { } @Override - public CompletableFuture requestElements(boolean refresh) { + public CompletableFuture requestElements(RefreshBehavior refresh) { Map map = new HashMap<>(); try { for (Value val : values) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java index a5a1cee241..69bb88c148 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java @@ -22,6 +22,7 @@ import com.sun.jdi.LocalVariable; import com.sun.jdi.Value; 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; @@ -69,7 +70,7 @@ public class JdiModelTargetValueMap extends JdiModelTargetObjectImpl { } @Override - public CompletableFuture requestAttributes(boolean refresh) { + public CompletableFuture requestAttributes(RefreshBehavior refresh) { return updateUsingValues(values); } diff --git a/Ghidra/Debug/Debugger/ghidra_scripts/RefreshRegistersScript.java b/Ghidra/Debug/Debugger/ghidra_scripts/RefreshRegistersScript.java index cdc907ce53..3922e2b9ea 100644 --- a/Ghidra/Debug/Debugger/ghidra_scripts/RefreshRegistersScript.java +++ b/Ghidra/Debug/Debugger/ghidra_scripts/RefreshRegistersScript.java @@ -19,6 +19,7 @@ import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.script.GhidraScript; import ghidra.app.services.*; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetRegisterBank; import ghidra.dbg.util.PathMatcher; @@ -52,7 +53,7 @@ public class RefreshRegistersScript extends GhidraScript { // If you know the names of the registers to read bank.readRegistersNamed("rax", "rbx").get(); // Values are coupled to elements, so we can also just refresh them to re-read all - bank.fetchElements(true).get(); + bank.fetchElements(RefreshBehavior.REFRESH_ALWAYS).get(); } /** @@ -76,7 +77,7 @@ public class RefreshRegistersScript extends GhidraScript { for (TargetRegisterBank bank : banks) { // Now do the same to the bank as before bank.invalidateCaches().get(); - bank.fetchElements(true).get(); + bank.fetchElements(RefreshBehavior.REFRESH_ALWAYS).get(); } } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java index 4265314674..ccddc4156a 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java @@ -56,6 +56,7 @@ import ghidra.app.services.*; import ghidra.app.services.DebuggerTraceManagerService.ActivationCause; import ghidra.async.*; import ghidra.dbg.*; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetConsole.Channel; @@ -546,7 +547,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter for (Object obj : map.values()) { if (obj instanceof TargetObject) { TargetObject ref = (TargetObject) obj; - ref.fetchAttributes(true).thenAccept(attrs -> { + ref.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS).thenAccept(attrs -> { table.setColumns(); // TODO: What with attrs? }).exceptionally(ex -> { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java index fa7f39ef60..102ee9dc36 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java @@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture; import org.jdom.Element; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; import ghidra.util.xml.XmlUtilities; @@ -156,7 +157,7 @@ public class ObjectContainer implements Comparable { if (targetObject == null) { return CompletableFuture.completedFuture(null); } - return targetObject.resync(true, true).thenApplyAsync(__ -> { + return targetObject.resync(RefreshBehavior.REFRESH_ALWAYS, RefreshBehavior.REFRESH_ALWAYS).thenApplyAsync(__ -> { rebuildContainers(targetObject.getCachedElements(), targetObject.getCachedAttributes()); propagateProvider(provider); return this; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java index ba8bcf027d..a5cdfddd2f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java @@ -22,6 +22,7 @@ import org.apache.commons.lang3.StringUtils; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetObject; public class DummyTargetObject implements TargetObject { @@ -157,7 +158,7 @@ public class DummyTargetObject implements TargetObject { } @Override - public CompletableFuture resync(boolean attributes, boolean elements) { + public CompletableFuture resync(RefreshBehavior attributes, RefreshBehavior elements) { return AsyncUtils.NIL; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java index d4f50f0631..6bdf6132e6 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java @@ -19,6 +19,7 @@ import java.util.*; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsPlugin; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetObject; @@ -30,7 +31,7 @@ public class ObjectElementRow { public ObjectElementRow(TargetObject ref, DebuggerObjectsProvider provider) { this.to = ref; - to.fetchAttributes(true).thenAccept(attributes -> { + to.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS).thenAccept(attributes -> { map = attributes; }).exceptionally(ex -> { DebuggerObjectsPlugin plugin = provider.getPlugin(); diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/debug/flatapi/FlatDebuggerAPITest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/debug/flatapi/FlatDebuggerAPITest.java index 120f037db9..b066820cbc 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/debug/flatapi/FlatDebuggerAPITest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/debug/flatapi/FlatDebuggerAPITest.java @@ -48,6 +48,7 @@ import ghidra.app.services.*; import ghidra.app.services.LogicalBreakpoint.State; import ghidra.dbg.DebuggerModelFactory; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.model.*; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; import ghidra.dbg.target.TargetObject; @@ -1208,8 +1209,8 @@ public class FlatDebuggerAPITest extends AbstractGhidraHeadedDebuggerGUITest { int pid, AddressSpace space) { return new TestTargetProcess(container, pid, space) { @Override - public CompletableFuture resync(boolean refreshAttributes, - boolean refreshElements) { + public CompletableFuture resync(RefreshBehavior refreshAttributes, + RefreshBehavior refreshElements) { observed.add(this); return super.resync(refreshAttributes, refreshElements); } @@ -1234,8 +1235,8 @@ public class FlatDebuggerAPITest extends AbstractGhidraHeadedDebuggerGUITest { int pid, AddressSpace space) { return new TestTargetProcess(container, pid, space) { @Override - public CompletableFuture resync(boolean refreshAttributes, - boolean refreshElements) { + public CompletableFuture resync(RefreshBehavior refreshAttributes, + RefreshBehavior refreshElements) { observed.add(this); return super.resync(refreshAttributes, refreshElements); } @@ -1247,8 +1248,8 @@ public class FlatDebuggerAPITest extends AbstractGhidraHeadedDebuggerGUITest { int tid) { return new TestTargetThread(container, tid) { @Override - public CompletableFuture resync(boolean refreshAttributes, - boolean refreshElements) { + public CompletableFuture resync(RefreshBehavior refreshAttributes, + RefreshBehavior refreshElements) { observed.add(this); return super.resync(refreshAttributes, refreshElements); } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java index a391d44a89..b5732f1b32 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java @@ -21,6 +21,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.function.Predicate; import ghidra.async.*; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.error.*; import ghidra.dbg.target.TargetMemory; import ghidra.dbg.target.TargetObject; @@ -64,6 +65,13 @@ import ghidra.util.Msg; * risk deadlocking Ghidra's UI. */ public interface DebuggerObjectModel { + + public static enum RefreshBehavior { + REFRESH_ALWAYS, + REFRESH_NEVER, + REFRESH_WHEN_ABSENT + } + public static final TypeSpec> ELEMENT_MAP_TYPE = TypeSpec.auto(); public static final TypeSpec> ATTRIBUTE_MAP_TYPE = TypeSpec.auto(); @@ -247,16 +255,16 @@ public interface DebuggerObjectModel { * @return a future map of attributes */ public CompletableFuture> fetchObjectAttributes(List path, - boolean refresh); + RefreshBehavior refresh); /** * Fetch the attributes of the given model path, without refreshing * - * @see #fetchObjectAttributes(List, boolean) + * @see #fetchObjectAttributes(List, RefreshBehavior) */ public default CompletableFuture> fetchObjectAttributes( List path) { - return fetchObjectAttributes(path, false); + return fetchObjectAttributes(path, RefreshBehavior.REFRESH_NEVER); } /** @@ -279,16 +287,16 @@ public interface DebuggerObjectModel { * @return a future map of elements */ public CompletableFuture> fetchObjectElements( - List path, boolean refresh); + List path, RefreshBehavior refresh); /** * Fetch the elements of the given model path, without refreshing * - * @see #fetchObjectElements(List, boolean) + * @see #fetchObjectElements(List, RefreshBehavior) */ public default CompletableFuture> fetchObjectElements( List path) { - return fetchObjectElements(path, false); + return fetchObjectElements(path, RefreshBehavior.REFRESH_NEVER); } /** diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java index ef75886b17..e85872ca48 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode; @@ -132,7 +133,7 @@ public class DefaultTargetObject } @Override - public CompletableFuture resync(boolean refreshAttributes, boolean refreshElements) { + public CompletableFuture resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements) { return CompletableFuture.allOf(fetchAttributes(refreshAttributes), fetchElements(refreshElements)); } @@ -157,12 +158,12 @@ public class DefaultTargetObject * @param refresh true to invalidate all caches involved in handling this request * @return a future which completes when the cache has been updated */ - protected CompletableFuture requestElements(boolean refresh) { + protected CompletableFuture requestElements(RefreshBehavior refresh) { return AsyncUtils.NIL; } - private boolean shouldRequestElements(boolean refresh) { - if (refresh) { + private boolean shouldRequestElements(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { return true; } ResyncMode resync = getSchema().getElementResyncMode(); @@ -179,7 +180,7 @@ public class DefaultTargetObject * response, then complete with {@link #elementsView}. */ @Override - public CompletableFuture> fetchElements(boolean refresh) { + public CompletableFuture> fetchElements(RefreshBehavior refresh) { CompletableFuture req; synchronized (elements) { if (shouldRequestElements(refresh)) { @@ -192,7 +193,7 @@ public class DefaultTargetObject @Override public CompletableFuture> fetchElements() { - return fetchElements(false); + return fetchElements(RefreshBehavior.REFRESH_NEVER); } @Override @@ -340,17 +341,17 @@ public class DefaultTargetObject * reason to believe the model is not keeping its attribute cache up to date. * *

- * This method otherwise operates analogously to {@link #requestElements(boolean)}. + * This method otherwise operates analogously to {@link #requestElements(RefreshBehavior)}. * * @param refresh true to invalidate all caches involved in handling this request * @return a future which completes when the cache has been updated */ - protected CompletableFuture requestAttributes(boolean refresh) { + protected CompletableFuture requestAttributes(RefreshBehavior refresh) { return AsyncUtils.NIL; } - private boolean shouldRequestAttributes(boolean refresh) { - if (refresh) { + private boolean shouldRequestAttributes(RefreshBehavior refresh) { + if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) { return true; } ResyncMode resync = getSchema().getAttributeResyncMode(); @@ -367,7 +368,7 @@ public class DefaultTargetObject * object's attributes are unchanging. */ @Override - public CompletableFuture> fetchAttributes(boolean refresh) { + public CompletableFuture> fetchAttributes(RefreshBehavior refresh) { CompletableFuture req; synchronized (attributes) { // update_mode does not affect attributes. They always behave as if UNSOLICITED. @@ -388,7 +389,7 @@ public class DefaultTargetObject @Override public CompletableFuture> fetchAttributes() { - return fetchAttributes(false); + return fetchAttributes(RefreshBehavior.REFRESH_NEVER); } @Override diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java index 44ed7b105b..3d2824887f 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java @@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; @@ -39,11 +40,11 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { public static CompletableFuture fetchFreshChild(TargetObject obj, String key) { if (PathUtils.isIndex(key)) { - return obj.fetchElements(true).thenApply(elements -> { + return obj.fetchElements(RefreshBehavior.REFRESH_ALWAYS).thenApply(elements -> { return elements.get(PathUtils.parseIndex(key)); }); } - return obj.fetchAttributes(true).thenApply(attributes -> { + return obj.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS).thenApply(attributes -> { return attributes.get(key); }); } @@ -103,7 +104,7 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { @Override public default CompletableFuture> fetchObjectElements( - List path, boolean refresh) { + List path, RefreshBehavior refresh) { return fetchModelObject(path).thenCompose(obj -> { if (obj == null) { return AsyncUtils.nil(); @@ -114,7 +115,7 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { @Override default CompletableFuture> fetchObjectAttributes(List path, - boolean refresh) { + RefreshBehavior refresh) { return fetchModelObject(path).thenCompose(obj -> { if (obj == null) { return AsyncUtils.nil(); diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetObject.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetObject.java index 5bebb43252..45e015577e 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetObject.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetObject.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import ghidra.async.AsyncFence; import ghidra.async.AsyncUtils; import ghidra.dbg.*; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; @@ -527,17 +528,17 @@ public interface TargetObject extends Comparable { * @param refresh true to invalidate all caches involved in handling this request * @return a future which completes with a name-value map of attributes */ - public default CompletableFuture> fetchAttributes(boolean refresh) { + public default CompletableFuture> fetchAttributes(RefreshBehavior refresh) { return getModel().fetchObjectAttributes(getPath(), refresh); } /** * Fetch all attributes of this object, without refreshing * - * @see #fetchAttributes(boolean) + * @see #fetchAttributes(RefreshBehavior) */ public default CompletableFuture> fetchAttributes() { - return fetchAttributes(false); + return fetchAttributes(RefreshBehavior.REFRESH_NEVER); } /** @@ -618,17 +619,17 @@ public interface TargetObject extends Comparable { * @return a future which completes with a index-value map of elements */ public default CompletableFuture> fetchElements( - boolean refresh) { + RefreshBehavior refresh) { return getModel().fetchObjectElements(getPath(), refresh); } /** * Fetch all elements of this object, without refreshing * - * @see #fetchElements(boolean) + * @see #fetchElements(RefreshBehavior) */ public default CompletableFuture> fetchElements() { - return fetchElements(false); + return fetchElements(RefreshBehavior.REFRESH_NEVER); } /** @@ -653,7 +654,7 @@ public interface TargetObject extends Comparable { * @param refresh true to invalidate all caches involved in handling this request * @return a future which completes with a name-value map of children */ - public default CompletableFuture> fetchChildren(boolean refresh) { + public default CompletableFuture> fetchChildren(RefreshBehavior refresh) { AsyncFence fence = new AsyncFence(); Map children = new TreeMap<>(TargetObjectKeyComparator.CHILD); fence.include(fetchElements(refresh).thenAccept(elements -> { @@ -671,7 +672,7 @@ public interface TargetObject extends Comparable { * @see #fetchChildren(boolean) */ public default CompletableFuture> fetchChildren() { - return fetchChildren(false); + return fetchChildren(RefreshBehavior.REFRESH_NEVER); } /** @@ -951,7 +952,7 @@ public interface TargetObject extends Comparable { * @param refreshElements as the model to refresh elements, querying the debugger if needed * @return a future which completes when the children are updated. */ - CompletableFuture resync(boolean refreshAttributes, boolean refreshElements); + CompletableFuture resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements); /** * Refresh the elements of this object @@ -959,7 +960,7 @@ public interface TargetObject extends Comparable { * @return a future which completes when the children are updated. */ default CompletableFuture resync() { - return resync(false, true); + return resync(RefreshBehavior.REFRESH_NEVER, RefreshBehavior.REFRESH_ALWAYS); } /** diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/schema/AnnotatedSchemaContext.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/schema/AnnotatedSchemaContext.java index dcb8ac7870..fb0c785bda 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/schema/AnnotatedSchemaContext.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/schema/AnnotatedSchemaContext.java @@ -25,6 +25,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.TypeUtils; import ghidra.dbg.DebuggerTargetObjectIface; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.DefaultTargetObjectSchema.DefaultAttributeSchema; @@ -101,7 +102,7 @@ public class AnnotatedSchemaContext extends DefaultSchemaContext { static Set> getBoundsOfFetchElements( Class cls) { try { - Method method = cls.getMethod("fetchElements", new Class[] { boolean.class }); + Method method = cls.getMethod("fetchElements", new Class[] { RefreshBehavior.class }); Type ret = method.getGenericReturnType(); Map, Type> argsCf = TypeUtils.getTypeArguments(ret, CompletableFuture.class); diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/target/schema/AnnotatedTargetObjectSchemaTest.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/target/schema/AnnotatedTargetObjectSchemaTest.java index a79c7cd687..305434bf6b 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/target/schema/AnnotatedTargetObjectSchemaTest.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/target/schema/AnnotatedTargetObjectSchemaTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.CompletableFuture; import org.junit.Test; import ghidra.async.AsyncUtils; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.agent.*; import ghidra.dbg.target.*; import ghidra.dbg.target.schema.DefaultTargetObjectSchema.DefaultAttributeSchema; @@ -105,7 +106,7 @@ public class AnnotatedTargetObjectSchemaTest { @Override public CompletableFuture> fetchElements( - boolean refresh) { + RefreshBehavior refresh) { return null; // Doesn't matter } } @@ -322,7 +323,7 @@ public class AnnotatedTargetObjectSchemaTest { @Override public CompletableFuture> fetchElements( - boolean refresh) { + RefreshBehavior refresh) { return null; // Doesn't matter } } diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DebuggerModelTestUtils.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DebuggerModelTestUtils.java index 99564dde47..4d5a23fb55 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DebuggerModelTestUtils.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DebuggerModelTestUtils.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import ghidra.async.*; import ghidra.dbg.*; import ghidra.dbg.DebugModelConventions.AsyncAccess; +import ghidra.dbg.DebuggerObjectModel.RefreshBehavior; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetConsole.Channel; @@ -177,7 +178,7 @@ public interface DebuggerModelTestUtils extends AsyncTestUtils { @SuppressWarnings({ "rawtypes", "unchecked" }) default Collection fetchAttachables(TargetObject container) throws Throwable { - return (Collection) waitOn(container.fetchElements(true)).values(); + return (Collection) waitOn(container.fetchElements(RefreshBehavior.REFRESH_ALWAYS)).values(); } default TargetProcess getProcessRunning(DebuggerTestSpecimen specimen,