From 5c316929b82c7f5bf4f77e762ed151e49c976f07 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:04:14 -0500 Subject: [PATCH] GP-4305: Return failed futures instead of throwing. --- .../service/model/DefaultThreadRecorder.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultThreadRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultThreadRecorder.java index 45f6d234e6..eba86126e5 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultThreadRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultThreadRecorder.java @@ -20,7 +20,7 @@ import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import ghidra.app.plugin.core.debug.mapping.*; +import ghidra.app.plugin.core.debug.mapping.DefaultDebuggerTargetTraceMapper; import ghidra.app.plugin.core.debug.service.model.interfaces.*; import ghidra.async.AsyncFence; import ghidra.async.AsyncUtils; @@ -164,7 +164,8 @@ public class DefaultThreadRecorder implements ManagedThreadRecorder { public CompletableFuture> captureThreadRegisters( TraceThread thread, int frameLevel, Set registers) { if (regMapper == null) { - throw new IllegalStateException("Have not found register descriptions for " + thread); + return CompletableFuture.failedFuture( + new IllegalStateException("Have not found register descriptions for " + thread)); } List tRegs = registers.stream() .map(regMapper::traceToTarget) @@ -180,20 +181,25 @@ public class DefaultThreadRecorder implements ManagedThreadRecorder { Set banks = getTargetRegisterBank(thread, frameLevel); if (banks == null) { - throw new IllegalArgumentException( - "Given thread and frame level does not have a live register bank"); + return CompletableFuture.failedFuture(new IllegalArgumentException( + "Given thread and frame level does not have a live register bank")); } // NOTE: Cache update, if applicable, will cause recorder to write values to trace AsyncFence fence = new AsyncFence(); Map result = new HashMap<>(); for (TargetRegisterBank bank : banks) { - fence.include(bank.readRegisters(tRegs) - .thenApply(regMapper::targetToTrace) - .thenAccept(br -> { - synchronized (result) { - result.putAll(br); - } - })); + try { + fence.include(bank.readRegisters(tRegs) + .thenApply(regMapper::targetToTrace) + .thenAccept(br -> { + synchronized (result) { + result.putAll(br); + } + })); + } + catch (Exception e) { + fence.include(CompletableFuture.failedFuture(e)); + } } return fence.ready().thenApply(__ -> result); }