blob: 8a0d691f7a5c51aef184d44bc0fd836458abbe32 [file] [log] [blame]
package org.eclipse.debug.jdi.tests;
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/
import com.sun.jdi.event.AccessWatchpointEvent;
import com.sun.jdi.event.BreakpointEvent;
import com.sun.jdi.event.ClassPrepareEvent;
import com.sun.jdi.event.ClassUnloadEvent;
import com.sun.jdi.event.Event;
import com.sun.jdi.event.ExceptionEvent;
import com.sun.jdi.event.MethodEntryEvent;
import com.sun.jdi.event.MethodExitEvent;
import com.sun.jdi.event.ModificationWatchpointEvent;
import com.sun.jdi.event.StepEvent;
import com.sun.jdi.event.ThreadDeathEvent;
import com.sun.jdi.event.ThreadStartEvent;
import com.sun.jdi.event.VMDeathEvent;
import com.sun.jdi.event.VMDisconnectEvent;
import com.sun.jdi.request.EventRequest;
/**
* Listen for a specific kind of event.
*/
public class EventWaiter implements EventListener {
protected EventRequest fRequest;
protected boolean fShouldGo;
protected Event fEvent;
/**
* Creates a new EventWaiter for the given request. Sets whether it
* should let the VM go after it got the event.
*/
public EventWaiter(EventRequest request, boolean shouldGo) {
fRequest = request;
fShouldGo = shouldGo;
}
public boolean accessWatchpoint(AccessWatchpointEvent event) {
return handleEvent(event);
}
public boolean methodEntry(MethodEntryEvent event) {
return handleEvent(event);
}
public boolean methodExit(MethodExitEvent event) {
return handleEvent(event);
}
public boolean breakpoint(BreakpointEvent event) {
return handleEvent(event);
}
public boolean classPrepare(ClassPrepareEvent event) {
return handleEvent(event);
}
public boolean classUnload(ClassUnloadEvent event) {
return handleEvent(event);
}
public boolean exception(ExceptionEvent event) {
return handleEvent(event);
}
/**
* Handles an incoming event.
* Returns whether the VM should be resumed if it was suspended.
*/
protected boolean handleEvent(Event event) {
if ((event.request() != null) && (event.request().equals(fRequest))) {
notifyEvent(event);
return fShouldGo;
} else
return true;
}
public boolean modificationWatchpoint(ModificationWatchpointEvent event) {
return handleEvent(event);
}
/**
* Notify any object that is waiting for an event.
*/
synchronized protected void notifyEvent(Event event) {
notify();
fEvent = event;
}
public boolean step(StepEvent event) {
return handleEvent(event);
}
public boolean threadDeath(ThreadDeathEvent event) {
return handleEvent(event);
}
public boolean threadStart(ThreadStartEvent event) {
return handleEvent(event);
}
public boolean vmDeath(VMDeathEvent event) {
if (fEvent == null) {
// This is the last event we can ever get an this was not the one we expected
notifyEvent(null);
return true;
}
return handleEvent(event);
}
public boolean vmDisconnect(VMDisconnectEvent event) {
return handleEvent(event);
}
/**
* Waits for the first event corresponding to this waiter's request.
*/
synchronized public Event waitEvent() throws InterruptedException {
if (fEvent == null) // If event didn't already come in
wait();
Event result = fEvent;
fEvent = null;
return result;
}
/**
* Waits for the first event corresponding to this waiter's request
* for the given time (in ms). If it times out, return null.
*/
synchronized public Event waitEvent(long time)
throws InterruptedException {
if (fEvent == null) // If event didn't already come in
wait(time);
Event result = fEvent;
fEvent = null;
return result;
}
}