📄 eventhandler.java
字号:
/* * @(#)EventHandler.java 1.34 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//* * Copyright (c) 1997-1999 by Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */package com.sun.tools.example.debug.tty;import com.sun.jdi.*;import com.sun.jdi.event.*;import com.sun.jdi.request.EventRequestManager;import com.sun.jdi.request.EventRequest;import java.io.PrintStream;import java.util.StringTokenizer;import java.util.Collection;import java.util.Iterator;public class EventHandler implements Runnable { EventNotifier notifier; Thread thread; volatile boolean connected = true; boolean completed = false; String shutdownMessageKey; boolean stopOnVMStart; EventHandler(EventNotifier notifier, boolean stopOnVMStart) { this.notifier = notifier; this.stopOnVMStart = stopOnVMStart; this.thread = new Thread(this, "event-handler"); this.thread.start(); } synchronized void shutdown() { connected = false; // force run() loop termination thread.interrupt(); while (!completed) { try {wait();} catch (InterruptedException exc) {} } } public void run() { EventQueue queue = Env.vm().eventQueue(); while (connected) { try { EventSet eventSet = queue.remove(); boolean resumeStoppedApp = false; EventIterator it = eventSet.eventIterator(); while (it.hasNext()) { resumeStoppedApp |= !handleEvent(it.nextEvent()); } if (resumeStoppedApp) { eventSet.resume(); } else if (eventSet.suspendPolicy() == EventRequest.SUSPEND_ALL) { setCurrentThread(eventSet); notifier.vmInterrupted(); } } catch (InterruptedException exc) { // Do nothing. Any changes will be seen at top of loop. } catch (VMDisconnectedException discExc) { handleDisconnectedException(); break; } } synchronized (this) { completed = true; notifyAll(); } } private boolean handleEvent(Event event) { notifier.receivedEvent(event); if (event instanceof ExceptionEvent) { return exceptionEvent(event); } else if (event instanceof BreakpointEvent) { return breakpointEvent(event); } else if (event instanceof WatchpointEvent) { return fieldWatchEvent(event); } else if (event instanceof StepEvent) { return stepEvent(event); } else if (event instanceof MethodEntryEvent) { return methodEntryEvent(event); } else if (event instanceof MethodExitEvent) { return methodExitEvent(event); } else if (event instanceof ClassPrepareEvent) { return classPrepareEvent(event); } else if (event instanceof ClassUnloadEvent) { return classUnloadEvent(event); } else if (event instanceof ThreadStartEvent) { return threadStartEvent(event); } else if (event instanceof ThreadDeathEvent) { return threadDeathEvent(event); } else if (event instanceof VMStartEvent) { return vmStartEvent(event); } else { return handleExitEvent(event); } } private boolean vmDied = false; private boolean handleExitEvent(Event event) { if (event instanceof VMDeathEvent) { vmDied = true; return vmDeathEvent(event); } else if (event instanceof VMDisconnectEvent) { connected = false; if (!vmDied) { vmDisconnectEvent(event); } Env.shutdown(shutdownMessageKey); return false; } else { throw new InternalError(MessageOutput.format("Unexpected event type")); } } synchronized void handleDisconnectedException() { /* * A VMDisconnectedException has happened while dealing with * another event. We need to flush the event queue, dealing only * with exit events (VMDeath, VMDisconnect) so that we terminate * correctly. */ EventQueue queue = Env.vm().eventQueue(); while (connected) { try { EventSet eventSet = queue.remove(); EventIterator iter = eventSet.eventIterator(); while (iter.hasNext()) { handleExitEvent((Event)iter.next()); } } catch (InterruptedException exc) { // ignore } } } private ThreadReference eventThread(Event event) { if (event instanceof ClassPrepareEvent) { return ((ClassPrepareEvent)event).thread(); } else if (event instanceof LocatableEvent) { return ((LocatableEvent)event).thread(); } else if (event instanceof ThreadStartEvent) { return ((ThreadStartEvent)event).thread(); } else if (event instanceof ThreadDeathEvent) { return ((ThreadDeathEvent)event).thread(); } else if (event instanceof VMStartEvent) { return ((VMStartEvent)event).thread(); } else { return null; } } private void setCurrentThread(EventSet set) { ThreadReference thread; if (set.size() > 0) { /* * If any event in the set has a thread associated with it, * they all will, so just grab the first one. */ Event event = (Event)set.iterator().next(); // Is there a better way? thread = eventThread(event); } else { thread = null; } setCurrentThread(thread); } private void setCurrentThread(ThreadReference thread) { ThreadInfo.invalidateAll(); ThreadInfo.setCurrentThread(thread); } private boolean vmStartEvent(Event event) { VMStartEvent se = (VMStartEvent)event; notifier.vmStartEvent(se); return stopOnVMStart; } private boolean breakpointEvent(Event event) { BreakpointEvent be = (BreakpointEvent)event; notifier.breakpointEvent(be); return true; } private boolean methodEntryEvent(Event event) { MethodEntryEvent me = (MethodEntryEvent)event; notifier.methodEntryEvent(me); return true; } private boolean methodExitEvent(Event event) { MethodExitEvent me = (MethodExitEvent)event; notifier.methodExitEvent(me); return true; } private boolean fieldWatchEvent(Event event) { WatchpointEvent fwe = (WatchpointEvent)event; notifier.fieldWatchEvent(fwe); return true; } private boolean stepEvent(Event event) { StepEvent se = (StepEvent)event; notifier.stepEvent(se); return true; } private boolean classPrepareEvent(Event event) { ClassPrepareEvent cle = (ClassPrepareEvent)event; notifier.classPrepareEvent(cle); if (!Env.specList.resolve(cle)) { MessageOutput.lnprint("Stopping due to deferred breakpoint errors."); return true; } else { return false; } } private boolean classUnloadEvent(Event event) { ClassUnloadEvent cue = (ClassUnloadEvent)event; notifier.classUnloadEvent(cue); return false; } private boolean exceptionEvent(Event event) { ExceptionEvent ee = (ExceptionEvent)event; notifier.exceptionEvent(ee); return true; } private boolean threadDeathEvent(Event event) { ThreadDeathEvent tee = (ThreadDeathEvent)event; ThreadInfo.removeThread(tee.thread()); return false; } private boolean threadStartEvent(Event event) { ThreadStartEvent tse = (ThreadStartEvent)event; ThreadInfo.addThread(tse.thread()); notifier.threadStartEvent(tse); return false; } public boolean vmDeathEvent(Event event) { shutdownMessageKey = "The application exited"; notifier.vmDeathEvent((VMDeathEvent)event); return false; } public boolean vmDisconnectEvent(Event event) { shutdownMessageKey = "The application has been disconnected"; notifier.vmDisconnectEvent((VMDisconnectEvent)event); return false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -