1 7 34 package com.sun.tools.example.debug.bdi; 35 36 import com.sun.jdi.*; 37 import com.sun.jdi.event.*; 38 39 import java.util.*; 40 41 import com.sun.tools.example.debug.event.*; 42 43 import javax.swing.SwingUtilities ; 44 45 47 class JDIEventSource extends Thread { 48 49 private EventQueue queue; 50 private Session session; 51 private ExecutionManager runtime; 52 private final JDIListener firstListener = new FirstListener(); 53 54 private boolean wantInterrupt; 56 59 JDIEventSource(Session session) { 60 super("JDI Event Set Dispatcher"); 61 this.session = session; 62 this.runtime = session.runtime; 63 this.queue = session.vm.eventQueue(); 64 } 65 66 public void run() { 67 try { 68 runLoop(); 69 } catch (Exception exc) { 70 } 73 session.running = false; 74 } 75 76 private void runLoop() throws InterruptedException { 77 AbstractEventSet es; 78 do { 79 EventSet jdiEventSet = queue.remove(); 80 es = AbstractEventSet.toSpecificEventSet(jdiEventSet); 81 session.interrupted = es.suspendedAll(); 82 dispatchEventSet(es); 83 } while(!(es instanceof VMDisconnectEventSet)); 84 } 85 86 private void dispatchEventSet(final AbstractEventSet es) { 88 SwingUtilities.invokeLater(new Runnable () { 89 public void run() { 90 boolean interrupted = es.suspendedAll(); 91 es.notify(firstListener); 92 boolean wantInterrupt = JDIEventSource.this.wantInterrupt; 93 for (Iterator it = session.runtime.jdiListeners.iterator(); 94 it.hasNext(); ) { 95 JDIListener jl = (JDIListener)it.next(); 96 es.notify(jl); 97 } 98 if (interrupted && !wantInterrupt) { 99 session.interrupted = false; 100 try { 102 session.vm.resume(); 103 } catch (VMDisconnectedException ee) {} 104 } 105 if (es instanceof ThreadDeathEventSet) { 106 ThreadReference t = ((ThreadDeathEventSet)es).getThread(); 107 session.runtime.removeThreadInfo(t); 108 } 109 } 110 }); 111 } 112 113 private void finalizeEventSet(AbstractEventSet es) { 114 if (session.interrupted && !wantInterrupt) { 115 session.interrupted = false; 116 try { 118 session.vm.resume(); 119 } catch (VMDisconnectedException ee) {} 120 } 121 if (es instanceof ThreadDeathEventSet) { 122 ThreadReference t = ((ThreadDeathEventSet)es).getThread(); 123 session.runtime.removeThreadInfo(t); 124 } 125 } 126 127 private class FirstListener implements JDIListener { 129 130 public void accessWatchpoint(AccessWatchpointEventSet e) { 131 session.runtime.validateThreadInfo(); 132 wantInterrupt = true; 133 } 134 135 public void classPrepare(ClassPrepareEventSet e) { 136 wantInterrupt = false; 137 runtime.resolve(e.getReferenceType()); 138 } 139 140 public void classUnload(ClassUnloadEventSet e) { 141 wantInterrupt = false; 142 } 143 144 public void exception(ExceptionEventSet e) { 145 wantInterrupt = true; 146 } 147 148 public void locationTrigger(LocationTriggerEventSet e) { 149 session.runtime.validateThreadInfo(); 150 wantInterrupt = true; 151 } 152 153 public void modificationWatchpoint(ModificationWatchpointEventSet e) { 154 session.runtime.validateThreadInfo(); 155 wantInterrupt = true; 156 } 157 158 public void threadDeath(ThreadDeathEventSet e) { 159 wantInterrupt = false; 160 } 161 162 public void threadStart(ThreadStartEventSet e) { 163 wantInterrupt = false; 164 } 165 166 public void vmDeath(VMDeathEventSet e) { 167 wantInterrupt = false; 170 } 171 172 public void vmDisconnect(VMDisconnectEventSet e) { 173 wantInterrupt = false; 175 session.runtime.endSession(); 176 } 177 178 public void vmStart(VMStartEventSet e) { 179 wantInterrupt = false; 181 } 182 } 183 } 184 | Popular Tags |