1 7 34 35 package com.sun.tools.example.debug.tty; 36 37 import com.sun.jdi.*; 38 import com.sun.jdi.event.*; 39 import com.sun.jdi.request.EventRequestManager; 40 import com.sun.jdi.request.EventRequest; 41 42 import java.io.PrintStream ; 43 import java.util.StringTokenizer ; 44 import java.util.Collection ; 45 import java.util.Iterator ; 46 47 public class EventHandler implements Runnable { 48 49 EventNotifier notifier; 50 Thread thread; 51 volatile boolean connected = true; 52 boolean completed = false; 53 String shutdownMessageKey; 54 boolean stopOnVMStart; 55 56 EventHandler(EventNotifier notifier, boolean stopOnVMStart) { 57 this.notifier = notifier; 58 this.stopOnVMStart = stopOnVMStart; 59 this.thread = new Thread (this, "event-handler"); 60 this.thread.start(); 61 } 62 63 synchronized void shutdown() { 64 connected = false; thread.interrupt(); 66 while (!completed) { 67 try {wait();} catch (InterruptedException exc) {} 68 } 69 } 70 71 public void run() { 72 EventQueue queue = Env.vm().eventQueue(); 73 while (connected) { 74 try { 75 EventSet eventSet = queue.remove(); 76 boolean resumeStoppedApp = false; 77 EventIterator it = eventSet.eventIterator(); 78 while (it.hasNext()) { 79 resumeStoppedApp |= !handleEvent(it.nextEvent()); 80 } 81 82 if (resumeStoppedApp) { 83 eventSet.resume(); 84 } else if (eventSet.suspendPolicy() == EventRequest.SUSPEND_ALL) { 85 setCurrentThread(eventSet); 86 notifier.vmInterrupted(); 87 } 88 } catch (InterruptedException exc) { 89 } catch (VMDisconnectedException discExc) { 91 handleDisconnectedException(); 92 break; 93 } 94 } 95 synchronized (this) { 96 completed = true; 97 notifyAll(); 98 } 99 } 100 101 private boolean handleEvent(Event event) { 102 notifier.receivedEvent(event); 103 104 if (event instanceof ExceptionEvent) { 105 return exceptionEvent(event); 106 } else if (event instanceof BreakpointEvent) { 107 return breakpointEvent(event); 108 } else if (event instanceof WatchpointEvent) { 109 return fieldWatchEvent(event); 110 } else if (event instanceof StepEvent) { 111 return stepEvent(event); 112 } else if (event instanceof MethodEntryEvent) { 113 return methodEntryEvent(event); 114 } else if (event instanceof MethodExitEvent) { 115 return methodExitEvent(event); 116 } else if (event instanceof ClassPrepareEvent) { 117 return classPrepareEvent(event); 118 } else if (event instanceof ClassUnloadEvent) { 119 return classUnloadEvent(event); 120 } else if (event instanceof ThreadStartEvent) { 121 return threadStartEvent(event); 122 } else if (event instanceof ThreadDeathEvent) { 123 return threadDeathEvent(event); 124 } else if (event instanceof VMStartEvent) { 125 return vmStartEvent(event); 126 } else { 127 return handleExitEvent(event); 128 } 129 } 130 131 private boolean vmDied = false; 132 private boolean handleExitEvent(Event event) { 133 if (event instanceof VMDeathEvent) { 134 vmDied = true; 135 return vmDeathEvent(event); 136 } else if (event instanceof VMDisconnectEvent) { 137 connected = false; 138 if (!vmDied) { 139 vmDisconnectEvent(event); 140 } 141 Env.shutdown(shutdownMessageKey); 142 return false; 143 } else { 144 throw new InternalError (MessageOutput.format("Unexpected event type", 145 new Object [] {event.getClass()})); 146 } 147 } 148 149 synchronized void handleDisconnectedException() { 150 156 EventQueue queue = Env.vm().eventQueue(); 157 while (connected) { 158 try { 159 EventSet eventSet = queue.remove(); 160 EventIterator iter = eventSet.eventIterator(); 161 while (iter.hasNext()) { 162 handleExitEvent((Event)iter.next()); 163 } 164 } catch (InterruptedException exc) { 165 } catch (InternalError exc) { 167 } 169 } 170 } 171 172 private ThreadReference eventThread(Event event) { 173 if (event instanceof ClassPrepareEvent) { 174 return ((ClassPrepareEvent)event).thread(); 175 } else if (event instanceof LocatableEvent) { 176 return ((LocatableEvent)event).thread(); 177 } else if (event instanceof ThreadStartEvent) { 178 return ((ThreadStartEvent)event).thread(); 179 } else if (event instanceof ThreadDeathEvent) { 180 return ((ThreadDeathEvent)event).thread(); 181 } else if (event instanceof VMStartEvent) { 182 return ((VMStartEvent)event).thread(); 183 } else { 184 return null; 185 } 186 } 187 188 private void setCurrentThread(EventSet set) { 189 ThreadReference thread; 190 if (set.size() > 0) { 191 195 Event event = (Event)set.iterator().next(); thread = eventThread(event); 197 } else { 198 thread = null; 199 } 200 setCurrentThread(thread); 201 } 202 203 private void setCurrentThread(ThreadReference thread) { 204 ThreadInfo.invalidateAll(); 205 ThreadInfo.setCurrentThread(thread); 206 } 207 208 private boolean vmStartEvent(Event event) { 209 VMStartEvent se = (VMStartEvent)event; 210 notifier.vmStartEvent(se); 211 return stopOnVMStart; 212 } 213 214 private boolean breakpointEvent(Event event) { 215 BreakpointEvent be = (BreakpointEvent)event; 216 notifier.breakpointEvent(be); 217 return true; 218 } 219 220 private boolean methodEntryEvent(Event event) { 221 MethodEntryEvent me = (MethodEntryEvent)event; 222 notifier.methodEntryEvent(me); 223 return true; 224 } 225 226 private boolean methodExitEvent(Event event) { 227 MethodExitEvent me = (MethodExitEvent)event; 228 return notifier.methodExitEvent(me); 229 } 230 231 private boolean fieldWatchEvent(Event event) { 232 WatchpointEvent fwe = (WatchpointEvent)event; 233 notifier.fieldWatchEvent(fwe); 234 return true; 235 } 236 237 private boolean stepEvent(Event event) { 238 StepEvent se = (StepEvent)event; 239 notifier.stepEvent(se); 240 return true; 241 } 242 243 private boolean classPrepareEvent(Event event) { 244 ClassPrepareEvent cle = (ClassPrepareEvent)event; 245 notifier.classPrepareEvent(cle); 246 247 if (!Env.specList.resolve(cle)) { 248 MessageOutput.lnprint("Stopping due to deferred breakpoint errors."); 249 return true; 250 } else { 251 return false; 252 } 253 } 254 255 private boolean classUnloadEvent(Event event) { 256 ClassUnloadEvent cue = (ClassUnloadEvent)event; 257 notifier.classUnloadEvent(cue); 258 return false; 259 } 260 261 private boolean exceptionEvent(Event event) { 262 ExceptionEvent ee = (ExceptionEvent)event; 263 notifier.exceptionEvent(ee); 264 return true; 265 } 266 267 private boolean threadDeathEvent(Event event) { 268 ThreadDeathEvent tee = (ThreadDeathEvent)event; 269 ThreadInfo.removeThread(tee.thread()); 270 return false; 271 } 272 273 private boolean threadStartEvent(Event event) { 274 ThreadStartEvent tse = (ThreadStartEvent)event; 275 ThreadInfo.addThread(tse.thread()); 276 notifier.threadStartEvent(tse); 277 return false; 278 } 279 280 public boolean vmDeathEvent(Event event) { 281 shutdownMessageKey = "The application exited"; 282 notifier.vmDeathEvent((VMDeathEvent)event); 283 return false; 284 } 285 286 public boolean vmDisconnectEvent(Event event) { 287 shutdownMessageKey = "The application has been disconnected"; 288 notifier.vmDisconnectEvent((VMDisconnectEvent)event); 289 return false; 290 } 291 } 292 | Popular Tags |