08855df46a
Reviewed-by: vlivanov, erikj, mseledtsov, gthornbr
149 lines
5.6 KiB
Java
149 lines
5.6 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|
|
}
|