1 /*
2 * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
3 * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26 /* @test id=aggressive-verify
27 * @summary Test JNI Global Refs with Shenandoah
28 * @requires vm.gc.Shenandoah
29 *
30 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
31 * -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive
32 * -XX:+ShenandoahVerify
33 * TestJNIGlobalRefs
34 */
35
36 /* @test id=aggressive
37 * @summary Test JNI Global Refs with Shenandoah
38 * @requires vm.gc.Shenandoah
39 *
40 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
41 * -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive
42 * TestJNIGlobalRefs
43 */
44
45 /* @test id=generational-verify
46 * @summary Test JNI Global Refs with Shenandoah
47 * @requires vm.gc.Shenandoah
48 *
49 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
50 * -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
51 * -XX:+ShenandoahVerify
52 * TestJNIGlobalRefs
53 */
54
55 /* @test id=generational
56 * @summary Test JNI Global Refs with Shenandoah
57 * @requires vm.gc.Shenandoah
58 *
59 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
60 * -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
61 * TestJNIGlobalRefs
62 */
63
64 import java.util.Arrays;
65 import java.util.Random;
66
67 public class TestJNIGlobalRefs {
68 static {
69 System.loadLibrary("TestJNIGlobalRefs");
70 }
71
72 private static final long TIME_NSEC = 120L * 1_000_000_000L;
73 private static final int ARRAY_SIZE = 10000;
74
75 private static native void makeGlobalRef(Object o);
76 private static native void makeWeakGlobalRef(Object o);
77 private static native Object readGlobalRef();
78 private static native Object readWeakGlobalRef();
79
80 public static void main(String[] args) throws Throwable {
81 seedGlobalRef();
82 seedWeakGlobalRef();
83 long startNanos = System.nanoTime();
84 long currentNanos = startNanos;
85 while (currentNanos - startNanos < TIME_NSEC) {
86 testGlobal();
87 testWeakGlobal();
88 Thread.sleep(1);
89 currentNanos = System.nanoTime();
90 }
91 }
92
93 private static void seedGlobalRef() {
94 int[] a = new int[ARRAY_SIZE];
95 fillArray(a, 1337);
96 makeGlobalRef(a);
97 }
98
99 private static void seedWeakGlobalRef() {
100 int[] a = new int[ARRAY_SIZE];
101 fillArray(a, 8080);
102 makeWeakGlobalRef(a);
103 }
104
105 private static void testGlobal() {
106 int[] a = (int[]) readGlobalRef();
107 checkArray(a, 1337);
108 }
109
110 private static void testWeakGlobal() {
111 int[] a = (int[]) readWeakGlobalRef();
112 if (a != null) {
113 checkArray(a, 8080);
114 } else {
115 // weak reference is cleaned, recreate:
116 seedWeakGlobalRef();
117 }
118 }
119
120 private static void fillArray(int[] array, int seed) {
121 Random r = new Random(seed);
122 for (int i = 0; i < ARRAY_SIZE; i++) {
123 array[i] = r.nextInt();
124 }
125 }
126
127 private static void checkArray(int[] array, int seed) {
128 Random r = new Random(seed);
129 if (array.length != ARRAY_SIZE) {
130 throw new IllegalStateException("Illegal array length: " + array.length + ", but expected " + ARRAY_SIZE);
131 }
132 for (int i = 0; i < ARRAY_SIZE; i++) {
133 int actual = array[i];
134 int expected = r.nextInt();
135 if (actual != expected) {
136 throw new IllegalStateException("Incorrect array data: " + actual + ", but expected " + expected);
137 }
138 }
139 }
140 }