001    package nl.cwi.sen1.tide.adapters.gdb;
002    
003    import java.util.HashMap;
004    import java.util.List;
005    import java.util.Map;
006    
007    import nl.cwi.sen1.tide.adapters.DebugAdapterProcess;
008    import nl.cwi.sen1.tide.adapters.DebugAdapterRule;
009    import aterm.ATerm;
010    import aterm.ATermFactory;
011    
012    public class GdbProcess extends DebugAdapterProcess implements Runnable {
013            private GdbAdapter adapter;
014            private Thread thread;
015    
016            private int pid = -1;
017            private String file;
018            private int line;
019            private int stackLevel;
020            private Map<Integer, DebugAdapterRule> rulesByBreak;
021            private Map<DebugAdapterRule, Integer> breaksByRule;
022    
023            private ATermFactory factory;
024    
025            public GdbProcess(GdbAdapter adapter, String name) {
026                    super(adapter, name);
027                    this.adapter = adapter;
028                    this.factory = adapter.getFactory();
029    
030                    rulesByBreak = new HashMap<Integer, DebugAdapterRule>();
031                    breaksByRule = new HashMap<DebugAdapterRule, Integer>();
032            }
033    
034            public int getPid() {
035                    return pid;
036            }
037            public void setPid(int pid) {
038                    this.pid = pid;
039            }
040            
041            public void setCpe(String file, int line) {
042                    this.file = file;
043                    this.line = line;
044            }
045            public void setStackLevel(int level) {
046                    stackLevel = level;
047            }
048    
049            public void handleRuleCreation(DebugAdapterRule rule) {
050                    super.handleRuleCreation(rule);
051                    List<?> result;
052    
053                    result = rule.getAction().match("location(pos(<str>,<int>,<int>))");
054                    if (result != null) {
055                            String file = (String) result.get(0);
056                            int linenr = ((Integer) result.get(1)).intValue();
057                            SetBreakpointCmd cmd = new SetBreakpointCmd(adapter, file, linenr);
058                            adapter.evaluate(cmd);
059                            Integer brk = new Integer(cmd.getBreakpoint());
060                            breaksByRule.put(rule, brk);
061                            rulesByBreak.put(brk, rule);
062                            adapter.writeln("disable " + brk);
063                    }
064            }
065    
066            public void handleRuleDestruction(DebugAdapterRule rule) {
067                    super.handleRuleDestruction(rule);
068                    Integer brk = breaksByRule.get(rule);
069                    if (brk != null) {
070                            adapter.writeln("delete " + brk);
071                            breaksByRule.remove(rule);
072                            rulesByBreak.remove(brk);
073                    }
074            }
075    
076            public void handleRuleEnabling(DebugAdapterRule rule) {
077                    super.handleRuleEnabling(rule);
078                    Integer brk = breaksByRule.get(rule);
079                    if (brk != null) {
080                            adapter.writeln("enable " + brk);
081                    }
082            }
083            public void handleRuleDisabling(DebugAdapterRule rule) {
084                    super.handleRuleDisabling(rule);
085                    Integer brk = breaksByRule.get(rule);
086                    if (brk != null) {
087                            adapter.writeln("disable " + brk);
088                    }
089            }
090    
091            public void doResume() {
092                    System.out.println("doResume called");
093                    fireRules(DebugAdapterRule.PORT_STARTED);
094                    super.doResume();
095    
096                    thread = new Thread(this);
097                    thread.start();
098            }
099    
100            private void debugMsg(String msg) {
101                    System.err.println(msg);
102            }
103    
104            public void doBreak() {
105                    debugMsg("break not supported (yet!)");
106                    super.doBreak();
107                    
108                    /* TODO: find out what this is supposed to do
109                    try {
110                            Runtime.getRuntime().exec("/usr/bin/kill -INT " + pid);
111                    } catch (IOException e) {
112                            System.err.println(
113                                    "could not execute '/usr/bin/kill' to kill program: "
114                                            + e.getMessage());
115                    }
116                    */
117            }
118    
119            public ATerm actionCpe() {
120                    if (file == null) {
121                            debugMsg("current cpe is unknown");
122                            return factory.make("cpe(unknown)");
123                    }
124            debugMsg("current cpe is in file:" + file + ", line: " + line);
125            return factory.make(
126                    "location(line(<str>,<int>))",
127                    file,
128                    new Integer(line));
129            }
130    
131            public ATerm actionSourceVar(ATerm file, ATerm offset, ATerm line, ATerm col, ATerm text) {
132                    RetrieveVarCmd cmd = new RetrieveVarCmd(adapter, file, offset, line, col, text);
133                    adapter.evaluate(cmd);
134                    return cmd.getValue();
135            }
136    
137            public int getStackLevel() {
138                    return stackLevel;
139            }
140    
141            public void run() {
142                    fireRules(DebugAdapterRule.PORT_STARTED);
143                    while (getExecState() == STATE_RUNNING) {
144                            ContinueCmd cmd = new ContinueCmd(adapter, this);
145                            adapter.evaluate(cmd);
146                            fireRules(DebugAdapterRule.PORT_STEP);
147                            // TODO: find out why this was necessary?
148                //  fireLocationRules(file, line, 0, line, -1);
149                    }
150                    fireRules(DebugAdapterRule.PORT_STOPPED);
151            }
152    
153            //}
154    }