GP-704: Converting models to a push-centric comm pattern.

This commit is contained in:
Dan 2021-02-23 10:57:51 -05:00
parent dd37995833
commit 5bb6f95a84
95 changed files with 2348 additions and 1635 deletions

View file

@ -16,20 +16,27 @@
package agent.dbgmodel.model.impl;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import org.jdom.JDOMException;
import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.model.AbstractDbgModel;
import agent.dbgeng.model.iface2.DbgModelTargetObject;
import agent.dbgeng.model.iface2.DbgModelTargetSession;
import agent.dbgmodel.manager.DbgManager2Impl;
import ghidra.dbg.agent.AbstractTargetObject;
import ghidra.dbg.agent.AbstractTargetObject.ProxyFactory;
import ghidra.dbg.agent.SpiTargetObject;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetObjectSchema;
import ghidra.dbg.target.schema.XmlSchemaContext;
import ghidra.program.model.address.*;
import utilities.util.ProxyUtilities;
public class DbgModel2Impl extends AbstractDbgModel {
public class DbgModel2Impl extends AbstractDbgModel
implements ProxyFactory<List<Class<? extends TargetObject>>> {
// TODO: Need some minimal memory modeling per architecture on the model/agent side.
// The model must convert to and from Ghidra's address space names
protected static final String SPACE_NAME = "ram";
@ -66,6 +73,15 @@ public class DbgModel2Impl extends AbstractDbgModel {
//System.out.println(XmlSchemaContext.serialize(SCHEMA_CTX));
this.root = new DbgModel2TargetRootImpl(this, ROOT_SCHEMA);
this.completedRoot = CompletableFuture.completedFuture(root);
addModelRoot(root);
}
@Override
public SpiTargetObject createProxy(AbstractTargetObject<?> delegate,
List<Class<? extends TargetObject>> mixins) {
mixins.add(DbgModel2TargetProxy.class);
return ProxyUtilities.composeOnDelegate(DbgModelTargetObject.class,
(DbgModelTargetObject) delegate, mixins, DelegateDbgModel2TargetObject.LOOKUP);
}
@Override
@ -116,7 +132,7 @@ public class DbgModel2Impl extends AbstractDbgModel {
public CompletableFuture<Void> close() {
try {
terminate();
return CompletableFuture.completedFuture(null);
return super.close();
}
catch (Throwable t) {
return CompletableFuture.failedFuture(t);

View file

@ -59,8 +59,6 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
protected String DBG_PROMPT = "(kd2)"; // Used by DbgModelTargetEnvironment
protected boolean fireAttributesChanged = false;
protected static String indexObject(ModelObject obj) {
return obj.getSearchKey();
}
@ -84,6 +82,12 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
super(model, parent, name, typeHint, schema);
}
public <I> DbgModel2TargetObjectImpl(ProxyFactory<I> proxyFactory, I proxyInfo,
AbstractDbgModel model, TargetObject parent, String name,
String typeHint) {
super(proxyFactory, proxyInfo, model, parent, name, typeHint);
}
@Override
public DbgModel2Impl getModel() {
return (DbgModel2Impl) super.getModel();
@ -127,7 +131,6 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
@Override
public CompletableFuture<Void> requestAttributes(boolean refresh) {
fireAttributesChanged = true;
Map<String, Object> nmap = new HashMap<>();
return requestNativeAttributes().thenCompose(map -> {
synchronized (attributes) {
@ -418,13 +421,10 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
schemax.validateAttributeDelta(getPath(), delta, enforcesStrictSchema());
}
doInvalidateAttributes(delta.removed, reason);
if (parent == null && !delta.isEmpty()) {
if (!delta.isEmpty()) {
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
return delta;
}
if (fireAttributesChanged && !delta.isEmpty()) {
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
}
return delta;
}
@ -439,14 +439,9 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
schemax.validateAttributeDelta(getPath(), delta, enforcesStrictSchema());
}
doInvalidateAttributes(delta.removed, reason);
if (fireAttributesChanged && !delta.isEmpty()) {
if (!delta.isEmpty()) {
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
}
return delta;
}
@Override
protected boolean enforcesStrictSchema() {
return false;
}
}

View file

@ -109,7 +109,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
}
if (doFire) {
this.focus = sel;
fireAttributesChanged = true;
changeAttributes(List.of(), List.of(), Map.of( //
TargetFocusScope.FOCUS_ATTRIBUTE_NAME, focus //
), "Focus changed");
@ -492,12 +491,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
});
}
//@Override
public void refresh() {
// TODO ???
System.err.println("root:refresh");
}
@Override
public TargetAccessibility getAccessibility() {
return accessibility;

View file

@ -28,13 +28,11 @@ import agent.dbgeng.model.iface2.*;
import agent.dbgmodel.dbgmodel.main.ModelObject;
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerObjectModel;
import ghidra.dbg.attributes.TargetObjectRef;
import ghidra.dbg.target.*;
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction;
import ghidra.dbg.util.PathUtils;
import ghidra.util.datastruct.ListenerSet;
import utilities.util.ProxyUtilities;
public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl implements //
DbgModelTargetAccessConditioned<DelegateDbgModel2TargetObject>, //
@ -160,7 +158,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
mixins.add(mixin);
}
}
return new DelegateDbgModel2TargetObject(model, parent, key, object, mixins).proxy;
return new DelegateDbgModel2TargetObject(model, parent, key, object, mixins).getProxy();
}
protected static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
@ -170,8 +168,6 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
protected final ProxyState state;
protected final Cleanable cleanable;
private final DbgModelTargetObject proxy;
private boolean breakpointEnabled;
private final ListenerSet<TargetBreakpointAction> breakpointActions =
new ListenerSet<>(TargetBreakpointAction.class) {
@ -189,15 +185,12 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
public DelegateDbgModel2TargetObject(DbgModel2Impl model, DbgModelTargetObject parent,
String key, ModelObject modelObject, List<Class<? extends TargetObject>> mixins) {
super(model, parent.getProxy(), key, getHintForObject(modelObject));
super(model, mixins, model, parent.getProxy(), key, getHintForObject(modelObject));
this.state = new ProxyState(model, modelObject);
this.cleanable = CLEANER.register(this, state);
getManager().addStateListener(accessListener);
mixins.add(DbgModel2TargetProxy.class);
this.proxy =
ProxyUtilities.composeOnDelegate(DbgModelTargetObject.class, this, mixins, LOOKUP);
if (proxy instanceof DbgEventsListener) {
model.getManager().addEventsListener((DbgEventsListener) proxy);
}
@ -216,11 +209,6 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
return delegate;
}
@Override
public <T extends TypedTargetObject<T>> T as(Class<T> iface) {
return DebuggerObjectModel.requireIface(iface, proxy, getPath());
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public CompletableFuture<? extends DelegateDbgModel2TargetObject> fetch() {
@ -228,8 +216,8 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
}
@Override
public TargetObject getProxy() {
return proxy;
public DbgModelTargetObject getProxy() {
return (DbgModelTargetObject) proxy;
}
@SuppressWarnings("unchecked")
@ -311,7 +299,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
return;
}
if (proxy instanceof DbgModelTargetRegister || proxy instanceof DbgModelTargetStackFrame) {
DbgThread thread = proxy.getParentThread().getThread();
DbgThread thread = getProxy().getParentThread().getThread();
if (thread.equals(getManager().getEventThread())) {
requestAttributes(true);
}
@ -354,6 +342,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
}
}
@Override
public DelegateDbgModel2TargetObject getDelegate() {
return this;
}
@ -388,6 +377,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
this.breakpointEnabled = enabled;
}
@Override
public ListenerSet<TargetBreakpointAction> getActions() {
return breakpointActions;
}