Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java')
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java86
1 files changed, 65 insertions, 21 deletions
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
index 8bcf2e757..9d3dae027 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
@@ -10,59 +10,103 @@
*******************************************************************************/
package com.windriver.debug.tcf.ui.model;
+import java.util.HashMap;
+import java.util.Map;
+
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IStackTrace;
public class TCFChildrenStackTrace extends TCFChildren {
- private final TCFChildren children_regs;
+ private final TCFChildrenRegisters children_regs;
+
+ private final Map<String,TCFNodeStackFrame> frames_cache =
+ new HashMap<String,TCFNodeStackFrame>();
- TCFChildrenStackTrace(TCFNode node, TCFChildren children_regs) {
+ TCFChildrenStackTrace(TCFNode node, TCFChildrenRegisters children_regs) {
super(node);
this.children_regs = children_regs;
}
@Override
- boolean validate(TCFRunnable done) {
- children_next.clear();
- String addr = node.getAddress();
- if (addr == null) {
- doneValidate();
+ void dispose() {
+ TCFNode arr[] = frames_cache.values().toArray(new TCFNode[frames_cache.size()]);
+ for (int i = 0; i < arr.length; i++) arr[i].dispose();
+ assert frames_cache.isEmpty();
+ assert children.isEmpty();
+ }
+
+ @Override
+ void dispose(String id) {
+ super.dispose(id);
+ frames_cache.remove(id);
+ }
+
+ void onSourceMappingChange() {
+ for (TCFNodeStackFrame n : frames_cache.values()) n.onSourceMappingChange();
+ }
+
+ void onSuspended() {
+ for (TCFNodeStackFrame n : frames_cache.values()) n.onSuspended();
+ valid = false;
+ }
+
+ void onResumed() {
+ valid = false;
+ }
+
+ @Override
+ boolean validate() {
+ final Map<String,TCFNode> new_children = new HashMap<String,TCFNode>();
+ if (!node.isSuspended()) {
+ doneValidate(new_children);
return true;
}
String nm = node.id + "-TF";
- TCFNode n = children.get(nm);
+ TCFNodeStackFrame n = frames_cache.get(nm);
+ if (n == null) n = (TCFNodeStackFrame)node.model.getNode(nm);
if (n == null) n = new TCFNodeStackFrame(node, nm, children_regs);
- children_next.put(n.id, n);
+ new_children.put(n.id, n);
+ frames_cache.put(n.id, n);
IStackTrace st = node.model.getLaunch().getService(IStackTrace.class);
if (st == null) {
- doneValidate();
+ doneValidate(new_children);
return true;
}
- assert node.data_command == null;
- if (done != null) node.wait_list.add(done);
- node.data_command = st.getChildren(node.id, new IStackTrace.DoneGetChildren() {
+ assert node.pending_command == null;
+ node.pending_command = st.getChildren(node.id, new IStackTrace.DoneGetChildren() {
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (node.data_command != token) return;
- node.data_command = null;
+ if (node.pending_command != token) return;
+ node.pending_command = null;
if (error != null) {
node.node_error = error;
}
else {
int cnt = contexts.length;
for (String id : contexts) {
- TCFNode n = node.model.getNode(id);
- if (n == null || ((TCFNodeStackFrame)n).getFrameNo() != cnt) {
+ TCFNodeStackFrame n = frames_cache.get(id);
+ if (n == null) n = (TCFNodeStackFrame)node.model.getNode(id);
+ if (n == null || n.getFrameNo() != cnt) {
+ if (n != null) n.dispose();
n = new TCFNodeStackFrame(node, id, cnt);
}
- assert ((TCFNodeStackFrame)n).getFrameNo() == cnt;
+ assert n.getFrameNo() == cnt;
assert n.id.equals(id);
- children_next.put(id, n);
+ assert n.parent == node;
+ new_children.put(id, n);
+ frames_cache.put(id, n);
cnt--;
}
+ if (frames_cache.size() > new_children.size() + 32) {
+ // Trim frame cache
+ TCFNode arr[] = frames_cache.values().toArray(new TCFNode[frames_cache.size()]);
+ for (int i = 0; i < arr.length; i++) {
+ if (new_children.get(arr[i].id) == null) arr[i].dispose();
+ }
+ }
}
- doneValidate();
- node.validateNode(null);
+ doneValidate(new_children);
+ node.validateNode();
}
});
return false;

Back to the top