blob: 8d2167b809cf05d87603f661deab9ff6edf6f15a [file] [log] [blame]
/*
* Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package nsk.share.jdi;
import com.sun.jdi.*;
import com.sun.jdi.event.*;
/*
* Classes included in this class represent JDI events on debugger VM's side
* All this classes contain information about JDI event which should be generated during test execution,
* instances of this classes should be created using instances of corresponding classes from debuggee VM
*/
public class DebuggerEventData
{
static abstract class DebugEventData
{
protected Class<?> eventClass;
public DebugEventData(Class<?> eventClass) {
this.eventClass = eventClass;
}
public boolean shouldCheckEvent(Event event) {
return this.eventClass.isAssignableFrom(event.getClass());
}
// is given event's data identical with data stored in this object
abstract public boolean checkEvent(Event event);
}
/*
* debug information about monitor event
*/
static abstract class DebugMonitorEventData extends DebugEventData {
protected ObjectReference monitor;
protected ThreadReference thread;
public DebugMonitorEventData(Class<?> eventClass, ObjectReference debuggeeMirror) {
super(eventClass);
this.eventClass = eventClass;
monitor = (ObjectReference) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("monitor"));
thread = (ThreadReference) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("thread"));
}
public String toString() {
return eventClass.getName() + " monitor: " + monitor + " thread: " + thread;
}
}
/*
* information about MonitorContendedEnterEvent
*/
static class DebugMonitorEnterEventData extends DebugMonitorEventData {
public DebugMonitorEnterEventData(ObjectReference debuggeeMirror) {
super(MonitorContendedEnterEvent.class, debuggeeMirror);
}
public boolean checkEvent(Event event) {
MonitorContendedEnterEvent monitorEnterEvent = (MonitorContendedEnterEvent) event;
return monitorEnterEvent.monitor().equals(monitor) && monitorEnterEvent.thread().equals(thread);
}
}
/*
* information about MonitorContendedEnteredEvent
*/
static class DebugMonitorEnteredEventData extends DebugMonitorEventData {
public DebugMonitorEnteredEventData(ObjectReference debuggeeMirror) {
super(MonitorContendedEnteredEvent.class, debuggeeMirror);
}
public boolean checkEvent(Event event) {
MonitorContendedEnteredEvent monitorEnterEvent = (MonitorContendedEnteredEvent) event;
return monitorEnterEvent.monitor().equals(monitor) && monitorEnterEvent.thread().equals(thread);
}
}
/*
* information about MonitorWaitEvent
*/
static class DebugMonitorWaitEventData extends DebugMonitorEventData {
private long timeout;
public DebugMonitorWaitEventData(ObjectReference debuggeeMirror) {
super(MonitorWaitEvent.class, debuggeeMirror);
timeout = ((LongValue) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("timeout"))).longValue();
}
public boolean checkEvent(Event event) {
MonitorWaitEvent monitorWaitEvent = (MonitorWaitEvent) event;
return monitorWaitEvent.monitor().equals(monitor) && monitorWaitEvent.thread().equals(thread) && (monitorWaitEvent.timeout() == timeout);
}
public String toString() {
return eventClass.getName() + " monitor: " + monitor + " thread: " + thread + " timeout: " + timeout;
}
}
/*
* information about MonitorWaitedEvent
*/
static class DebugMonitorWaitedEventData extends DebugMonitorEventData {
private boolean timedout;
public DebugMonitorWaitedEventData(ObjectReference debuggeeMirror) {
super(MonitorWaitedEvent.class, debuggeeMirror);
timedout = ((BooleanValue) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("timedout"))).booleanValue();
}
public boolean checkEvent(Event event) {
MonitorWaitedEvent monitorWaitedEvent = (MonitorWaitedEvent) event;
return monitorWaitedEvent.monitor().equals(monitor) && monitorWaitedEvent.thread().equals(thread)
&& (monitorWaitedEvent.timedout() == timedout);
}
public String toString() {
return eventClass.getName() + " monitor: " + monitor + " thread: " + thread + " timedout: " + timedout;
}
}
}