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 import java.util.Random;
27 import jdk.test.lib.Utils;
28
29 /*
30 * @test id=default
31 * @key randomness
32 * @requires vm.gc.Shenandoah
33 * @library /test/lib
34 *
35 * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:TieredStopAtLevel=0 -Xmx16m TestArrayCopyStress
36 */
37
38 /*
39 * @test id=generational
40 * @key randomness
41 * @requires vm.gc.Shenandoah
42 * @library /test/lib
43 *
44 * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational -XX:TieredStopAtLevel=0 -Xmx16m TestArrayCopyStress
45 */
46 public class TestArrayCopyStress {
47
48 private static final int ARRAY_SIZE = 1000;
49 private static final int ITERATIONS = 10000;
50
51 static class Foo {
52 int num;
53
54 Foo(int num) {
55 this.num = num;
56 }
57 }
58
59 static class Bar {}
60
61 public static void main(String[] args) throws Exception {
62 for (int i = 0; i < ITERATIONS; i++) {
63 testConjoint();
64 }
65 }
66
67 private static void testConjoint() {
68 Foo[] array = new Foo[ARRAY_SIZE];
69 for (int i = 0; i < ARRAY_SIZE; i++) {
70 array[i] = new Foo(i);
71 }
72 Random rng = Utils.getRandomInstance();
73 int src_idx = rng.nextInt(ARRAY_SIZE);
74 int dst_idx = rng.nextInt(ARRAY_SIZE);
75 int len = rng.nextInt(Math.min(ARRAY_SIZE - src_idx, ARRAY_SIZE - dst_idx));
76 System.arraycopy(array, src_idx, array, dst_idx, len);
77
78 for (int i = 0; i < ARRAY_SIZE; i++) {
79 if (i >= dst_idx && i < dst_idx + len) {
80 assertEquals(array[i].num, i - (dst_idx - src_idx));
81 } else {
82 assertEquals(array[i].num, i);
83 }
84 }
85 }
86
87 private static void assertEquals(int a, int b) {
88 if (a != b) throw new RuntimeException("assert failed");
89 }
90
91 }