Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdi/HiddenClass/events/EventHandler.java
41161 views
1
/*
2
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
package nsk.jdi.HiddenClass.events;
25
26
import com.sun.jdi.ClassType;
27
import com.sun.jdi.Field;
28
import com.sun.jdi.Method;
29
import com.sun.jdi.ReferenceType;
30
import com.sun.jdi.ThreadReference;
31
32
import com.sun.jdi.event.Event;
33
import com.sun.jdi.event.EventIterator;
34
import com.sun.jdi.event.EventSet;
35
import com.sun.jdi.event.BreakpointEvent;
36
import com.sun.jdi.event.ClassPrepareEvent;
37
import com.sun.jdi.event.ClassUnloadEvent;
38
import com.sun.jdi.event.ModificationWatchpointEvent;
39
import com.sun.jdi.request.EventRequest;
40
41
import jdk.test.lib.Asserts;
42
import nsk.jdi.HiddenClass.events.DebuggerBase;
43
44
import nsk.share.Log;
45
46
/* This is a special thread to handle hidden class related events.
47
* The thread is looping on accepting events until all the expected
48
* event types are received. */
49
public class EventHandler extends Thread {
50
private static final int TIMEOUT_DELTA = 1000; // milliseconds
51
private final DebuggerBase debuggerBase;
52
private final Log log;
53
54
private volatile boolean testFailed = false;
55
private boolean breakpointEventRecieived = false;
56
private boolean classPrepareEventRecieived = false;
57
private boolean classUnloadEventRecieived = false;
58
private boolean modificationWatchpointEventRecieived = false;
59
60
// Hidden class ReferenceType which is saved for debugger.
61
private ReferenceType hcRefType = null;
62
63
// This method is called by the debugger main thread.
64
static EventHandler createAndStart(DebuggerBase debuggerBase) {
65
// start EventHandler thread
66
EventHandler handler = new EventHandler(debuggerBase);
67
handler.start();
68
return handler;
69
}
70
71
// Constructor
72
private EventHandler(DebuggerBase debuggerBase) {
73
this.debuggerBase = debuggerBase;
74
this.log = debuggerBase.log;
75
log.display("\n# EventHandler is started");
76
}
77
78
// This method is called by the debugger main thread.
79
void waitForCompleteness() {
80
log.display("\n# Waiting for EventHandler to complete");
81
// wait for all expected events received or timeout exceeds
82
try {
83
super.join();
84
if (isAlive()) {
85
log.complain("FAILURE: Timeout for waiting event was exceeded");
86
interrupt();
87
testFailed = true;
88
} else {
89
log.display("# EventHandler completed");
90
}
91
} catch (InterruptedException ie) {
92
log.complain("FAIL: InterruptedException caught while waiting for eventHandler's death");
93
testFailed = true;
94
}
95
}
96
97
// This method is called by the debugger main thread to wait and get
98
// the hidden class reference type from its ClassPrepare event.
99
// The readyCmdSync with the debuggeee is not enough because a
100
// ClassPrepare event is delivered over JDWP protocol with a delay.
101
// A wait/notify sync is to ensure the debugger gets non-null value.
102
synchronized ReferenceType waitAndGetHCRefType() throws InterruptedException {
103
while (hcRefType == null) {
104
wait();
105
}
106
return hcRefType;
107
}
108
109
// This method is called by the debugger main thread.
110
boolean failedStatus() { return testFailed; }
111
112
// Save hidden class ReferenceType when its ClassPrepare event is received.
113
private synchronized void setHCRefType(ReferenceType type) {
114
hcRefType = type;
115
notifyAll();
116
}
117
118
private EventSet getNextEventSet() throws InterruptedException {
119
EventSet eventSet = debuggerBase.vm().eventQueue().remove(TIMEOUT_DELTA);
120
return eventSet;
121
}
122
123
// Breakpoint event handler.
124
private void checkBreakpointEvent(BreakpointEvent event) {
125
Method method = event.location().method();
126
ClassType type = (ClassType)method.declaringType();
127
128
// got expected event in a hidden class method
129
log.display("\nBreakpointEvent: " + event.toString());
130
log.display("BreakpointEvent: " + type.name() + "::" + method.name());
131
breakpointEventRecieived = true;
132
133
// find another method in the same hidden class
134
ThreadReference thread = event.thread();
135
Method methodToInvoke = debuggerBase.findMethod(type, "getHCField");
136
137
// invoke hidden class static method getNCField in debuggee VM
138
testFailed |= debuggerBase.invokeStaticMethod(thread, methodToInvoke);
139
}
140
141
// ClassPrepare event handler.
142
private void checkClassPrepareEvent(ClassPrepareEvent event) {
143
ReferenceType type = event.referenceType();
144
String name = type.name();
145
String sign = type.signature();
146
147
// set hidden class ReferenceType object for debugger
148
setHCRefType(type);
149
150
log.display("\nClassPrepareEvent: " + event.toString());
151
log.display("ClassPrepareEvent class name: " + name);
152
log.display("ClassPrepareEvent class sign: " + sign);
153
classPrepareEventRecieived = true;
154
Asserts.assertTrue(name.indexOf("HiddenClass") > 0 && name.indexOf("/0x") > 0,
155
"FAIL: unexpected class in ClassPrepareEvent");
156
}
157
158
// ClassUnload event handler.
159
private void checkClassUnloadEvent(ClassUnloadEvent event) {
160
EventRequest request = event.request();
161
String name = event.className();
162
163
log.display("\nClassUnloadEvent class name: " + name);
164
log.display("ClassUnloadEvent class sign: " + event.classSignature());
165
classUnloadEventRecieived = true;
166
Asserts.assertTrue(name.indexOf("HiddenClass") > 0 && name.indexOf("/0x") > 0,
167
"FAIL: unexpected class in ClassUnloadEvent");
168
}
169
170
// ModificationWatchpoint event handler.
171
private void checkModificationWatchpointEvent(ModificationWatchpointEvent event) {
172
EventRequest request = event.request();
173
Field field = event.field();
174
ReferenceType type = field.declaringType();
175
log.display("\nModificationWatchpointEvent: " + event.toString());
176
log.display("ModificationWatchpointEvent: field: " + type.name() + "::" + field.name());
177
log.display("ModificationWatchpointEvent: value: " + event.valueToBe().toString());
178
modificationWatchpointEventRecieived = true;
179
}
180
181
private void processEventSet(EventSet eventSet) throws InterruptedException {
182
// handle each event from the event set
183
EventIterator eventIterator = eventSet.eventIterator();
184
while (eventIterator.hasNext()) {
185
Event event = eventIterator.nextEvent();
186
187
if (!breakpointEventRecieived &&
188
event instanceof BreakpointEvent) {
189
checkBreakpointEvent((BreakpointEvent)event);
190
}
191
if (!classPrepareEventRecieived &&
192
event instanceof ClassPrepareEvent) {
193
checkClassPrepareEvent((ClassPrepareEvent)event);
194
}
195
if (!classUnloadEventRecieived &&
196
event instanceof ClassUnloadEvent) {
197
checkClassUnloadEvent((ClassUnloadEvent)event);
198
}
199
if (!modificationWatchpointEventRecieived &&
200
event instanceof ModificationWatchpointEvent) {
201
checkModificationWatchpointEvent((ModificationWatchpointEvent)event);
202
}
203
// ignore all other events
204
}
205
}
206
207
public void run() {
208
log.display("\nEventHandler started");
209
try {
210
// Handle events until all expected events are received.
211
while (!breakpointEventRecieived ||
212
!classPrepareEventRecieived ||
213
!classUnloadEventRecieived ||
214
!modificationWatchpointEventRecieived
215
) {
216
EventSet eventSet = getNextEventSet();
217
if (eventSet == null) {
218
continue;
219
}
220
processEventSet(eventSet);
221
eventSet.resume();
222
}
223
} catch (Throwable t) {
224
log.complain("Throwable in EventHandler: " + t);
225
testFailed = true;
226
}
227
log.display("\nEventHandler finished");
228
}
229
} // class EventHandler
230
231