mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
GP-3162: refresh bool->enum
This commit is contained in:
parent
a9baf9f6d8
commit
15c4345d71
116 changed files with 376 additions and 266 deletions
|
@ -18,6 +18,7 @@ package agent.dbgeng.model.iface2;
|
|||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.dbgeng.manager.DbgModuleMemory;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetMemory;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
|
@ -31,6 +32,6 @@ public interface DbgModelTargetMemoryContainer extends DbgModelTargetObject, Tar
|
|||
@Override
|
||||
public CompletableFuture<Void> writeMemory(Address address, byte[] data);
|
||||
|
||||
public CompletableFuture<Void> requestElements(boolean refresh);
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh);
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -50,7 +51,7 @@ public class DbgModelTargetAvailableContainerImpl extends DbgModelTargetObjectIm
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableProcesses().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.dbgeng.manager.DbgProcess;
|
|||
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
||||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -109,7 +110,7 @@ public class DbgModelTargetBreakpointContainerImpl extends DbgModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgManagerImpl manager = getManager();
|
||||
return manager.listBreakpoints().thenAccept(byNumber -> {
|
||||
List<TargetObject> specs;
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointSpec;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointLocation;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
|
@ -163,7 +164,7 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getInfo().thenAccept(i -> {
|
||||
synchronized (this) {
|
||||
setBreakpointInfo(i);
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgProcessImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
@ -48,14 +49,14 @@ public class DbgModelTargetEventContainerImpl extends DbgModelTargetObjectImpl
|
|||
public DbgModelTargetEventContainerImpl(DbgModelTargetDebugContainer debug) {
|
||||
super(debug.getModel(), debug, "Events", "EventContainer");
|
||||
this.debug = debug;
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgProcessImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
@ -48,14 +49,14 @@ public class DbgModelTargetExceptionContainerImpl extends DbgModelTargetObjectIm
|
|||
public DbgModelTargetExceptionContainerImpl(DbgModelTargetDebugContainer debug) {
|
||||
super(debug.getModel(), debug, "Exceptions", "ExceptionContainer");
|
||||
this.debug = debug;
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import agent.dbgeng.model.iface2.*;
|
|||
import generic.ULongSpan;
|
||||
import generic.ULongSpan.ULongSpanSet;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -54,15 +55,15 @@ public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl
|
|||
super(process.getModel(), process, "Memory", "MemoryContainer");
|
||||
this.process = process;
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import agent.dbgeng.manager.DbgModule;
|
|||
import agent.dbgeng.manager.DbgProcess;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModule;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModuleContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -49,7 +50,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
|||
this.targetProcess = process;
|
||||
this.process = process.process;
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -99,7 +100,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
List<TargetObject> result = new ArrayList<>();
|
||||
return process.listModules().thenAccept(byName -> {
|
||||
synchronized (this) {
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import agent.dbgeng.manager.DbgModule;
|
||||
import agent.dbgeng.manager.DbgModuleSection;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -38,7 +39,7 @@ public class DbgModelTargetModuleSectionContainerImpl extends DbgModelTargetObje
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
/*
|
||||
return module.listSections().thenAccept(byStart -> {
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -103,7 +104,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
DbgModelTargetProcess process = getTargetProcess(proc);
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,7 +117,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,12 +127,12 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
process.getModules().libraryUnloaded(info.toString());
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(false);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listProcesses().thenAccept(byIID -> {
|
||||
List<TargetObject> processes;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -24,6 +24,7 @@ import agent.dbgeng.manager.*;
|
|||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetFocusScope;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetEventScope.TargetEventType;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -263,9 +264,9 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> resync(boolean refreshAttributes, boolean refreshElements) {
|
||||
public CompletableFuture<Void> resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements) {
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
return super.resync(refreshAttributes, refreshElements);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgRegister;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerRegisterAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
|
@ -57,7 +58,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
this.thread = thread.getThread();
|
||||
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME, this //
|
||||
), "Initialized");
|
||||
|
@ -65,7 +66,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return thread.listRegisters().thenAccept(regs -> {
|
||||
if (regs.size() != registersByName.size()) {
|
||||
DbgModelImpl impl = (DbgModelImpl) model;
|
||||
|
@ -109,7 +110,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
Collection<String> names) {
|
||||
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
||||
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
|
||||
return requestElements(false);
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
return AsyncUtils.NIL;
|
||||
}).thenCompose(__ -> {
|
||||
|
@ -144,7 +145,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
public CompletableFuture<Void> writeRegistersNamed(Map<String, byte[]> values) {
|
||||
DbgManagerImpl manager = getManager();
|
||||
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
||||
return requestElements(false);
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}).thenCompose(__ -> {
|
||||
Map<String, ? extends TargetObject> regs = getCachedElements();
|
||||
Map<DbgRegister, BigInteger> toWrite = new LinkedHashMap<>();
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributes;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
|
@ -58,7 +59,7 @@ public class DbgModelTargetSessionAttributesImpl extends DbgModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import agent.dbgeng.dbgeng.DebugSessionId;
|
|||
import agent.dbgeng.manager.DbgCause;
|
||||
import agent.dbgeng.manager.DbgSession;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -65,7 +66,7 @@ public class DbgModelTargetSessionContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
/*
|
||||
DbgManagerImpl manager = getManager();
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.dbgeng.manager.*;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
|
@ -52,7 +53,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return thread.getThread().listStackFrames().thenAccept(f -> {
|
||||
List<TargetObject> frames;
|
||||
synchronized (this) {
|
||||
|
@ -85,7 +86,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
|
|||
|
||||
public void threadStateChangedSpecific(DbgState state, DbgReason reason) {
|
||||
if (!state.equals(DbgState.RUNNING)) {
|
||||
requestElements(true).exceptionally(e -> {
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
|
||||
Msg.error(this, "Could not update stack " + this + " on STOPPED");
|
||||
return null;
|
||||
});
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.dbgeng.manager.impl.DbgMinimalSymbol;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSymbolContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -45,7 +46,7 @@ public class DbgModelTargetSymbolContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return module.module.listMinimalSymbols().thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.reason.*;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -53,7 +54,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
|
|||
|
||||
getManager().addEventsListener(this);
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,7 +120,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return process.listThreads().thenAccept(byTID -> {
|
||||
List<TargetObject> threads;
|
||||
synchronized (this) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue