blob: 709c5dfe64183eabac47c003baa3a09d638b8934 [file] [log] [blame]
Vladimir Marko7dac8642019-11-06 17:09:30 +00001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vladimir Marko654f01c2021-05-26 16:40:20 +010017#include <sstream>
18
Vladimir Marko7dac8642019-11-06 17:09:30 +000019#include "jni.h"
20
Vladimir Marko654f01c2021-05-26 16:40:20 +010021#include "arch/context.h"
22#include "monitor.h"
23#include "scoped_thread_state_change-inl.h"
24#include "stack.h"
25#include "thread-current-inl.h"
26
Vladimir Marko7dac8642019-11-06 17:09:30 +000027namespace art {
28
29static inline bool VerifyManyParameters(
30 jint i1, jlong l1, jfloat f1, jdouble d1,
31 jint i2, jlong l2, jfloat f2, jdouble d2,
32 jint i3, jlong l3, jfloat f3, jdouble d3,
33 jint i4, jlong l4, jfloat f4, jdouble d4,
34 jint i5, jlong l5, jfloat f5, jdouble d5,
35 jint i6, jlong l6, jfloat f6, jdouble d6,
36 jint i7, jlong l7, jfloat f7, jdouble d7,
37 jint i8, jlong l8, jfloat f8, jdouble d8) {
38 return
39 (i1 == 11) && (l1 == 12) && (f1 == 13.0) && (d1 == 14.0) &&
40 (i2 == 21) && (l2 == 22) && (f2 == 23.0) && (d2 == 24.0) &&
41 (i3 == 31) && (l3 == 32) && (f3 == 33.0) && (d3 == 34.0) &&
42 (i4 == 41) && (l4 == 42) && (f4 == 43.0) && (d4 == 44.0) &&
43 (i5 == 51) && (l5 == 52) && (f5 == 53.0) && (d5 == 54.0) &&
44 (i6 == 61) && (l6 == 62) && (f6 == 63.0) && (d6 == 64.0) &&
45 (i7 == 71) && (l7 == 72) && (f7 == 73.0) && (d7 == 74.0) &&
46 (i8 == 81) && (l8 == 82) && (f8 == 83.0) && (d8 == 84.0);
47}
48
Vladimir Markofa458ac2020-02-12 14:08:07 +000049extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethodVoid(JNIEnv*, jclass) {
50 return 42;
51}
52
Vladimir Marko7dac8642019-11-06 17:09:30 +000053extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethod(JNIEnv*, jclass, jint i) {
54 return i;
55}
56
57extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethodWithManyParameters(
58 JNIEnv*, jclass,
59 jint i1, jlong l1, jfloat f1, jdouble d1,
60 jint i2, jlong l2, jfloat f2, jdouble d2,
61 jint i3, jlong l3, jfloat f3, jdouble d3,
62 jint i4, jlong l4, jfloat f4, jdouble d4,
63 jint i5, jlong l5, jfloat f5, jdouble d5,
64 jint i6, jlong l6, jfloat f6, jdouble d6,
65 jint i7, jlong l7, jfloat f7, jdouble d7,
66 jint i8, jlong l8, jfloat f8, jdouble d8) {
67 bool ok = VerifyManyParameters(
68 i1, l1, f1, d1,
69 i2, l2, f2, d2,
70 i3, l3, f3, d3,
71 i4, l4, f4, d4,
72 i5, l5, f5, d5,
73 i6, l6, f6, d6,
74 i7, l7, f7, d7,
75 i8, l8, f8, d8);
76 return ok ? 42 : -1;
77}
78
Vladimir Markofa458ac2020-02-12 14:08:07 +000079extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethodVoid(JNIEnv*, jclass) {
80 return 42;
81}
82
Vladimir Marko7dac8642019-11-06 17:09:30 +000083extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethod(JNIEnv*, jclass, jint i) {
84 return i;
85}
86
87extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethodWithManyParameters(
88 JNIEnv*, jclass,
89 jint i1, jlong l1, jfloat f1, jdouble d1,
90 jint i2, jlong l2, jfloat f2, jdouble d2,
91 jint i3, jlong l3, jfloat f3, jdouble d3,
92 jint i4, jlong l4, jfloat f4, jdouble d4,
93 jint i5, jlong l5, jfloat f5, jdouble d5,
94 jint i6, jlong l6, jfloat f6, jdouble d6,
95 jint i7, jlong l7, jfloat f7, jdouble d7,
96 jint i8, jlong l8, jfloat f8, jdouble d8) {
97 bool ok = VerifyManyParameters(
98 i1, l1, f1, d1,
99 i2, l2, f2, d2,
100 i3, l3, f3, d3,
101 i4, l4, f4, d4,
102 i5, l5, f5, d5,
103 i6, l6, f6, d6,
104 i7, l7, f7, d7,
105 i8, l8, f8, d8);
106 return ok ? 42 : -1;
107}
108
Vladimir Markofa458ac2020-02-12 14:08:07 +0000109extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethodVoid() {
110 return 42;
111}
112
Vladimir Marko7dac8642019-11-06 17:09:30 +0000113extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethod(jint i) {
114 return i;
115}
116
117extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethodWithManyParameters(
118 jint i1, jlong l1, jfloat f1, jdouble d1,
119 jint i2, jlong l2, jfloat f2, jdouble d2,
120 jint i3, jlong l3, jfloat f3, jdouble d3,
121 jint i4, jlong l4, jfloat f4, jdouble d4,
122 jint i5, jlong l5, jfloat f5, jdouble d5,
123 jint i6, jlong l6, jfloat f6, jdouble d6,
124 jint i7, jlong l7, jfloat f7, jdouble d7,
125 jint i8, jlong l8, jfloat f8, jdouble d8) {
126 bool ok = VerifyManyParameters(
127 i1, l1, f1, d1,
128 i2, l2, f2, d2,
129 i3, l3, f3, d3,
130 i4, l4, f4, d4,
131 i5, l5, f5, d5,
132 i6, l6, f6, d6,
133 i7, l7, f7, d7,
134 i8, l8, f8, d8);
135 return ok ? 42 : -1;
136}
137
Vladimir Marko03008222020-03-06 14:04:21 +0000138extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeILFFFFD(
139 jint i,
140 jlong l,
141 jfloat f1,
142 jfloat f2,
143 jfloat f3,
144 jfloat f4,
145 jdouble d) {
146 if (i != 1) return -1;
147 if (l != INT64_C(0xf00000002)) return -2;
148 if (f1 != 3.0f) return -3;
149 if (f2 != 4.0f) return -4;
150 if (f3 != 5.0f) return -5;
151 if (f4 != 6.0f) return -6;
152 if (d != 7.0) return -7;
153 return 42;
154}
155
156extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeLIFFFFD(
157 jlong l,
158 jint i,
159 jfloat f1,
160 jfloat f2,
161 jfloat f3,
162 jfloat f4,
163 jdouble d) {
164 if (l != INT64_C(0xf00000007)) return -1;
165 if (i != 6) return -2;
166 if (f1 != 5.0f) return -3;
167 if (f2 != 4.0f) return -4;
168 if (f3 != 3.0f) return -5;
169 if (f4 != 2.0f) return -6;
170 if (d != 1.0) return -7;
171 return 42;
172}
173
174extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFLIFFFD(
175 jfloat f1,
176 jlong l,
177 jint i,
178 jfloat f2,
179 jfloat f3,
180 jfloat f4,
181 jdouble d) {
182 if (f1 != 1.0f) return -3;
183 if (l != INT64_C(0xf00000002)) return -1;
184 if (i != 3) return -2;
185 if (f2 != 4.0f) return -4;
186 if (f3 != 5.0f) return -5;
187 if (f4 != 6.0f) return -6;
188 if (d != 7.0) return -7;
189 return 42;
190}
191
192extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIIIIII(
193 jdouble d1,
194 jdouble d2,
195 jint i1,
196 jint i2,
197 jint i3,
198 jint i4,
199 jint i5,
200 jint i6) {
201 if (d1 != 8.0) return -1;
202 if (d2 != 7.0) return -2;
203 if (i1 != 6) return -3;
204 if (i2 != 5) return -4;
205 if (i3 != 4) return -5;
206 if (i4 != 3) return -6;
207 if (i5 != 2) return -7;
208 if (i6 != 1) return -8;
209 return 42;
210}
211
212extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDFFILIII(
213 jdouble d,
214 jfloat f1,
215 jfloat f2,
216 jint i1,
217 jlong l,
218 jint i2,
219 jint i3,
220 jint i4) {
221 if (d != 1.0) return -1;
222 if (f1 != 2.0f) return -2;
223 if (f2 != 3.0f) return -3;
224 if (i1 != 4) return -4;
225 if (l != INT64_C(0xf00000005)) return -5;
226 if (i2 != 6) return -6;
227 if (i3 != 7) return -7;
228 if (i4 != 8) return -8;
229 return 42;
230}
231
232extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDFILIII(
233 jdouble d1,
234 jdouble d2,
235 jfloat f,
236 jint i1,
237 jlong l,
238 jint i2,
239 jint i3,
240 jint i4) {
241 if (d1 != 8.0) return -1;
242 if (d2 != 7.0) return -2;
243 if (f != 6.0f) return -3;
244 if (i1 != 5) return -4;
245 if (l != INT64_C(0xf00000004)) return -5;
246 if (i2 != 3) return -6;
247 if (i3 != 2) return -7;
248 if (i4 != 1) return -8;
249 return 42;
250}
251
252extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIFII(
253 jdouble d1,
254 jdouble d2,
255 jint i1,
256 jfloat f,
257 jint i2,
258 jint i3) {
259 if (d1 != 1.0) return -1;
260 if (d2 != 2.0) return -2;
261 if (i1 != 3) return -3;
262 if (f != 4.0f) return -4;
263 if (i2 != 5) return -5;
264 if (i3 != 6) return -6;
265 return 42;
266}
267
268extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFullArgs(
269 // Generated by script (then modified to close argument list):
270 // for i in {0..84}; do echo " jlong l$((i*3)),"; echo " jint i$((i*3+2)),"; done
271 jlong l0,
272 jint i2,
273 jlong l3,
274 jint i5,
275 jlong l6,
276 jint i8,
277 jlong l9,
278 jint i11,
279 jlong l12,
280 jint i14,
281 jlong l15,
282 jint i17,
283 jlong l18,
284 jint i20,
285 jlong l21,
286 jint i23,
287 jlong l24,
288 jint i26,
289 jlong l27,
290 jint i29,
291 jlong l30,
292 jint i32,
293 jlong l33,
294 jint i35,
295 jlong l36,
296 jint i38,
297 jlong l39,
298 jint i41,
299 jlong l42,
300 jint i44,
301 jlong l45,
302 jint i47,
303 jlong l48,
304 jint i50,
305 jlong l51,
306 jint i53,
307 jlong l54,
308 jint i56,
309 jlong l57,
310 jint i59,
311 jlong l60,
312 jint i62,
313 jlong l63,
314 jint i65,
315 jlong l66,
316 jint i68,
317 jlong l69,
318 jint i71,
319 jlong l72,
320 jint i74,
321 jlong l75,
322 jint i77,
323 jlong l78,
324 jint i80,
325 jlong l81,
326 jint i83,
327 jlong l84,
328 jint i86,
329 jlong l87,
330 jint i89,
331 jlong l90,
332 jint i92,
333 jlong l93,
334 jint i95,
335 jlong l96,
336 jint i98,
337 jlong l99,
338 jint i101,
339 jlong l102,
340 jint i104,
341 jlong l105,
342 jint i107,
343 jlong l108,
344 jint i110,
345 jlong l111,
346 jint i113,
347 jlong l114,
348 jint i116,
349 jlong l117,
350 jint i119,
351 jlong l120,
352 jint i122,
353 jlong l123,
354 jint i125,
355 jlong l126,
356 jint i128,
357 jlong l129,
358 jint i131,
359 jlong l132,
360 jint i134,
361 jlong l135,
362 jint i137,
363 jlong l138,
364 jint i140,
365 jlong l141,
366 jint i143,
367 jlong l144,
368 jint i146,
369 jlong l147,
370 jint i149,
371 jlong l150,
372 jint i152,
373 jlong l153,
374 jint i155,
375 jlong l156,
376 jint i158,
377 jlong l159,
378 jint i161,
379 jlong l162,
380 jint i164,
381 jlong l165,
382 jint i167,
383 jlong l168,
384 jint i170,
385 jlong l171,
386 jint i173,
387 jlong l174,
388 jint i176,
389 jlong l177,
390 jint i179,
391 jlong l180,
392 jint i182,
393 jlong l183,
394 jint i185,
395 jlong l186,
396 jint i188,
397 jlong l189,
398 jint i191,
399 jlong l192,
400 jint i194,
401 jlong l195,
402 jint i197,
403 jlong l198,
404 jint i200,
405 jlong l201,
406 jint i203,
407 jlong l204,
408 jint i206,
409 jlong l207,
410 jint i209,
411 jlong l210,
412 jint i212,
413 jlong l213,
414 jint i215,
415 jlong l216,
416 jint i218,
417 jlong l219,
418 jint i221,
419 jlong l222,
420 jint i224,
421 jlong l225,
422 jint i227,
423 jlong l228,
424 jint i230,
425 jlong l231,
426 jint i233,
427 jlong l234,
428 jint i236,
429 jlong l237,
430 jint i239,
431 jlong l240,
432 jint i242,
433 jlong l243,
434 jint i245,
435 jlong l246,
436 jint i248,
437 jlong l249,
438 jint i251,
439 jlong l252,
440 jint i254) {
441 jlong l = INT64_C(0xf00000000);
442 // Generated by script (then modified to close argument list):
443 // for i in {0..84}; do \
444 // echo " if (l$((i*3)) != l + $(($i*3))) return -$(($i*3));"; \
445 // echo " if (i$(($i*3+2)) != $(($i*3+2))) return -$(($i*3+2));"; \
446 // done
447 if (l0 != l + 0) return -0;
448 if (i2 != 2) return -2;
449 if (l3 != l + 3) return -3;
450 if (i5 != 5) return -5;
451 if (l6 != l + 6) return -6;
452 if (i8 != 8) return -8;
453 if (l9 != l + 9) return -9;
454 if (i11 != 11) return -11;
455 if (l12 != l + 12) return -12;
456 if (i14 != 14) return -14;
457 if (l15 != l + 15) return -15;
458 if (i17 != 17) return -17;
459 if (l18 != l + 18) return -18;
460 if (i20 != 20) return -20;
461 if (l21 != l + 21) return -21;
462 if (i23 != 23) return -23;
463 if (l24 != l + 24) return -24;
464 if (i26 != 26) return -26;
465 if (l27 != l + 27) return -27;
466 if (i29 != 29) return -29;
467 if (l30 != l + 30) return -30;
468 if (i32 != 32) return -32;
469 if (l33 != l + 33) return -33;
470 if (i35 != 35) return -35;
471 if (l36 != l + 36) return -36;
472 if (i38 != 38) return -38;
473 if (l39 != l + 39) return -39;
474 if (i41 != 41) return -41;
475 if (l42 != l + 42) return -42;
476 if (i44 != 44) return -44;
477 if (l45 != l + 45) return -45;
478 if (i47 != 47) return -47;
479 if (l48 != l + 48) return -48;
480 if (i50 != 50) return -50;
481 if (l51 != l + 51) return -51;
482 if (i53 != 53) return -53;
483 if (l54 != l + 54) return -54;
484 if (i56 != 56) return -56;
485 if (l57 != l + 57) return -57;
486 if (i59 != 59) return -59;
487 if (l60 != l + 60) return -60;
488 if (i62 != 62) return -62;
489 if (l63 != l + 63) return -63;
490 if (i65 != 65) return -65;
491 if (l66 != l + 66) return -66;
492 if (i68 != 68) return -68;
493 if (l69 != l + 69) return -69;
494 if (i71 != 71) return -71;
495 if (l72 != l + 72) return -72;
496 if (i74 != 74) return -74;
497 if (l75 != l + 75) return -75;
498 if (i77 != 77) return -77;
499 if (l78 != l + 78) return -78;
500 if (i80 != 80) return -80;
501 if (l81 != l + 81) return -81;
502 if (i83 != 83) return -83;
503 if (l84 != l + 84) return -84;
504 if (i86 != 86) return -86;
505 if (l87 != l + 87) return -87;
506 if (i89 != 89) return -89;
507 if (l90 != l + 90) return -90;
508 if (i92 != 92) return -92;
509 if (l93 != l + 93) return -93;
510 if (i95 != 95) return -95;
511 if (l96 != l + 96) return -96;
512 if (i98 != 98) return -98;
513 if (l99 != l + 99) return -99;
514 if (i101 != 101) return -101;
515 if (l102 != l + 102) return -102;
516 if (i104 != 104) return -104;
517 if (l105 != l + 105) return -105;
518 if (i107 != 107) return -107;
519 if (l108 != l + 108) return -108;
520 if (i110 != 110) return -110;
521 if (l111 != l + 111) return -111;
522 if (i113 != 113) return -113;
523 if (l114 != l + 114) return -114;
524 if (i116 != 116) return -116;
525 if (l117 != l + 117) return -117;
526 if (i119 != 119) return -119;
527 if (l120 != l + 120) return -120;
528 if (i122 != 122) return -122;
529 if (l123 != l + 123) return -123;
530 if (i125 != 125) return -125;
531 if (l126 != l + 126) return -126;
532 if (i128 != 128) return -128;
533 if (l129 != l + 129) return -129;
534 if (i131 != 131) return -131;
535 if (l132 != l + 132) return -132;
536 if (i134 != 134) return -134;
537 if (l135 != l + 135) return -135;
538 if (i137 != 137) return -137;
539 if (l138 != l + 138) return -138;
540 if (i140 != 140) return -140;
541 if (l141 != l + 141) return -141;
542 if (i143 != 143) return -143;
543 if (l144 != l + 144) return -144;
544 if (i146 != 146) return -146;
545 if (l147 != l + 147) return -147;
546 if (i149 != 149) return -149;
547 if (l150 != l + 150) return -150;
548 if (i152 != 152) return -152;
549 if (l153 != l + 153) return -153;
550 if (i155 != 155) return -155;
551 if (l156 != l + 156) return -156;
552 if (i158 != 158) return -158;
553 if (l159 != l + 159) return -159;
554 if (i161 != 161) return -161;
555 if (l162 != l + 162) return -162;
556 if (i164 != 164) return -164;
557 if (l165 != l + 165) return -165;
558 if (i167 != 167) return -167;
559 if (l168 != l + 168) return -168;
560 if (i170 != 170) return -170;
561 if (l171 != l + 171) return -171;
562 if (i173 != 173) return -173;
563 if (l174 != l + 174) return -174;
564 if (i176 != 176) return -176;
565 if (l177 != l + 177) return -177;
566 if (i179 != 179) return -179;
567 if (l180 != l + 180) return -180;
568 if (i182 != 182) return -182;
569 if (l183 != l + 183) return -183;
570 if (i185 != 185) return -185;
571 if (l186 != l + 186) return -186;
572 if (i188 != 188) return -188;
573 if (l189 != l + 189) return -189;
574 if (i191 != 191) return -191;
575 if (l192 != l + 192) return -192;
576 if (i194 != 194) return -194;
577 if (l195 != l + 195) return -195;
578 if (i197 != 197) return -197;
579 if (l198 != l + 198) return -198;
580 if (i200 != 200) return -200;
581 if (l201 != l + 201) return -201;
582 if (i203 != 203) return -203;
583 if (l204 != l + 204) return -204;
584 if (i206 != 206) return -206;
585 if (l207 != l + 207) return -207;
586 if (i209 != 209) return -209;
587 if (l210 != l + 210) return -210;
588 if (i212 != 212) return -212;
589 if (l213 != l + 213) return -213;
590 if (i215 != 215) return -215;
591 if (l216 != l + 216) return -216;
592 if (i218 != 218) return -218;
593 if (l219 != l + 219) return -219;
594 if (i221 != 221) return -221;
595 if (l222 != l + 222) return -222;
596 if (i224 != 224) return -224;
597 if (l225 != l + 225) return -225;
598 if (i227 != 227) return -227;
599 if (l228 != l + 228) return -228;
600 if (i230 != 230) return -230;
601 if (l231 != l + 231) return -231;
602 if (i233 != 233) return -233;
603 if (l234 != l + 234) return -234;
604 if (i236 != 236) return -236;
605 if (l237 != l + 237) return -237;
606 if (i239 != 239) return -239;
607 if (l240 != l + 240) return -240;
608 if (i242 != 242) return -242;
609 if (l243 != l + 243) return -243;
610 if (i245 != 245) return -245;
611 if (l246 != l + 246) return -246;
612 if (i248 != 248) return -248;
613 if (l249 != l + 249) return -249;
614 if (i251 != 251) return -251;
615 if (l252 != l + 252) return -252;
616 if (i254 != 254) return -254;
617 return 42;
618}
619
Vladimir Marko6bc480b2020-06-08 09:00:33 +0100620extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethodVoid() {
621 return 42;
622}
623
624extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethod(jint i) {
625 return i;
626}
627
628extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethodWithManyParameters(
629 jint i1, jlong l1, jfloat f1, jdouble d1,
630 jint i2, jlong l2, jfloat f2, jdouble d2,
631 jint i3, jlong l3, jfloat f3, jdouble d3,
632 jint i4, jlong l4, jfloat f4, jdouble d4,
633 jint i5, jlong l5, jfloat f5, jdouble d5,
634 jint i6, jlong l6, jfloat f6, jdouble d6,
635 jint i7, jlong l7, jfloat f7, jdouble d7,
636 jint i8, jlong l8, jfloat f8, jdouble d8) {
637 bool ok = VerifyManyParameters(
638 i1, l1, f1, d1,
639 i2, l2, f2, d2,
640 i3, l3, f3, d3,
641 i4, l4, f4, d4,
642 i5, l5, f5, d5,
643 i6, l6, f6, d6,
644 i7, l7, f7, d7,
645 i8, l8, f8, d8);
646 return ok ? 42 : -1;
647}
648
Vladimir Marko654f01c2021-05-26 16:40:20 +0100649extern "C" JNIEXPORT jint JNICALL Java_Main_b189235039CallThrough(JNIEnv* env, jobject m) {
650 jclass main_klass = env->GetObjectClass(m);
651 jmethodID checkLocks = env->GetStaticMethodID(main_klass, "b189235039CheckLocks", "(ILMain;)I");
652 if (checkLocks == nullptr) {
653 return -1;
654 }
655 return env->CallStaticIntMethod(main_klass, checkLocks, 42, m);
656}
657
658extern "C" JNIEXPORT jint JNICALL Java_Main_b189235039CheckLocks(JNIEnv*,
659 jclass,
660 int arg,
661 jobject lock) {
662 // Check that we do not crash when visiting locks and that we find the right lock.
663 ScopedObjectAccess soa(Thread::Current());
664 class VisitLocks : public StackVisitor {
665 public:
666 VisitLocks(Thread* thread, Context* context, jobject expected_lock)
667 : StackVisitor(thread, context, StackWalkKind::kIncludeInlinedFrames),
668 expected_lock_(expected_lock) {
669 }
670
671 bool VisitFrame() override REQUIRES_SHARED(Locks::mutator_lock_) {
672 ArtMethod* m = GetMethod();
673
674 // Ignore runtime methods.
675 if (m == nullptr || m->IsRuntimeMethod()) {
676 return true;
677 }
678
679 if (m->IsSynchronized()) {
680 // Interesting frame.
681 Monitor::VisitLocks(this, Callback, expected_lock_);
682 return false;
683 }
684
685 return true;
686 }
687
688 private:
689 static void Callback(ObjPtr<mirror::Object> obj, void* expected_lock)
690 REQUIRES_SHARED(Locks::mutator_lock_) {
691 CHECK(obj != nullptr);
692 CHECK(obj == Thread::Current()->DecodeJObject(reinterpret_cast<jobject>(expected_lock)));
693 }
694
695 jobject expected_lock_;
696 };
697 {
698 std::unique_ptr<Context> context(Context::Create());
699 VisitLocks vl(soa.Self(), context.get(), lock);
700 vl.WalkStack();
701 }
702 return arg;
703}
704
Vladimir Marko7dac8642019-11-06 17:09:30 +0000705} // namespace art