|
1 /* |
|
2 * Copyright (c) 2018, Red Hat, Inc. All rights reserved. |
|
3 * |
|
4 * This code is free software; you can redistribute it and/or modify it |
|
5 * under the terms of the GNU General Public License version 2 only, as |
|
6 * published by the Free Software Foundation. |
|
7 * |
|
8 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
11 * version 2 for more details (a copy is included in the LICENSE file that |
|
12 * accompanied this code). |
|
13 * |
|
14 * You should have received a copy of the GNU General Public License version |
|
15 * 2 along with this work; if not, write to the Free Software Foundation, |
|
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
17 * |
|
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
19 * or visit www.oracle.com if you need additional information or have any |
|
20 * questions. |
|
21 * |
|
22 */ |
|
23 |
|
24 import java.util.concurrent.*; |
|
25 |
|
26 /* |
|
27 * @test TestArrayCopyStress |
|
28 * @key gc |
|
29 * @requires vm.gc.Shenandoah |
|
30 * |
|
31 * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:TieredStopAtLevel=0 -Xmx16m TestArrayCopyStress |
|
32 */ |
|
33 public class TestArrayCopyStress { |
|
34 |
|
35 private static final int ARRAY_SIZE = 1000; |
|
36 private static final int ITERATIONS = 10000; |
|
37 |
|
38 static class Foo { |
|
39 int num; |
|
40 |
|
41 Foo(int num) { |
|
42 this.num = num; |
|
43 } |
|
44 } |
|
45 |
|
46 static class Bar {} |
|
47 |
|
48 public static void main(String[] args) throws Exception { |
|
49 for (int i = 0; i < ITERATIONS; i++) { |
|
50 testConjoint(); |
|
51 } |
|
52 } |
|
53 |
|
54 private static void testConjoint() { |
|
55 Foo[] array = new Foo[ARRAY_SIZE]; |
|
56 for (int i = 0; i < ARRAY_SIZE; i++) { |
|
57 array[i] = new Foo(i); |
|
58 } |
|
59 |
|
60 int src_idx = ThreadLocalRandom.current().nextInt(0, ARRAY_SIZE); |
|
61 int dst_idx = ThreadLocalRandom.current().nextInt(0, ARRAY_SIZE); |
|
62 int len = ThreadLocalRandom.current().nextInt(0, Math.min(ARRAY_SIZE - src_idx, ARRAY_SIZE - dst_idx)); |
|
63 System.arraycopy(array, src_idx, array, dst_idx, len); |
|
64 |
|
65 for (int i = 0; i < ARRAY_SIZE; i++) { |
|
66 if (i >= dst_idx && i < dst_idx + len) { |
|
67 assertEquals(array[i].num, i - (dst_idx - src_idx)); |
|
68 } else { |
|
69 assertEquals(array[i].num, i); |
|
70 } |
|
71 } |
|
72 } |
|
73 |
|
74 private static void assertEquals(int a, int b) { |
|
75 if (a != b) throw new RuntimeException("assert failed"); |
|
76 } |
|
77 |
|
78 } |