diff options
author | Ian Rogers <irogers@google.com> | 2013-01-10 20:07:57 -0800 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2013-01-10 20:12:45 -0800 |
commit | ffb5600d2b9ebb045d0db7020599a198d39d08c0 (patch) | |
tree | 25aac8941fa967dd113a0ce1b53d1b28fd819c09 /test/102-concurrent-gc | |
parent | 0ab2080369f080c9fd7bd975bbece6d0b82e3b6b (diff) | |
download | art-ffb5600d2b9ebb045d0db7020599a198d39d08c0.zip art-ffb5600d2b9ebb045d0db7020599a198d39d08c0.tar.gz art-ffb5600d2b9ebb045d0db7020599a198d39d08c0.tar.bz2 |
Move ConcurrentGC to run-test.
Change-Id: Icf12321ece840c2edd4de6a80bb0d319317abc98
Diffstat (limited to 'test/102-concurrent-gc')
-rw-r--r-- | test/102-concurrent-gc/expected.txt | 1 | ||||
-rw-r--r-- | test/102-concurrent-gc/info.txt | 2 | ||||
-rw-r--r-- | test/102-concurrent-gc/src/Main.java | 67 |
3 files changed, 70 insertions, 0 deletions
diff --git a/test/102-concurrent-gc/expected.txt b/test/102-concurrent-gc/expected.txt new file mode 100644 index 0000000..f75da10 --- /dev/null +++ b/test/102-concurrent-gc/expected.txt @@ -0,0 +1 @@ +Test complete diff --git a/test/102-concurrent-gc/info.txt b/test/102-concurrent-gc/info.txt new file mode 100644 index 0000000..b423127 --- /dev/null +++ b/test/102-concurrent-gc/info.txt @@ -0,0 +1,2 @@ +Test that attempts to hide objects from a concurrently running GC. The +concurrent GC should locate the "hidden" objects through a write-barrier. diff --git a/test/102-concurrent-gc/src/Main.java b/test/102-concurrent-gc/src/Main.java new file mode 100644 index 0000000..1a9e88e --- /dev/null +++ b/test/102-concurrent-gc/src/Main.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Random; + +public class Main { + private static final int buckets = 16 * 1024; + private static final int bufferSize = 1024; + + static class ByteContainer { + public byte[] bytes; + } + + public static void main(String[] args) throws Exception { + try { + ByteContainer[] l = new ByteContainer[buckets]; + + for (int i = 0; i < buckets; ++i) { + l[i] = new ByteContainer(); + } + + Random rnd = new Random(123456); + for (int i = 0; i < buckets / 256; ++i) { + int index = rnd.nextInt(buckets); + l[index].bytes = new byte[bufferSize]; + + // Try to get GC to run if we can + Runtime.getRuntime().gc(); + + // Shuffle the array to try cause the lost object problem: + // This problem occurs when an object is white, it may be + // only referenced from a white or grey object. If the white + // object is moved during a CMS to be a black object's field, it + // causes the moved object to not get marked. This can result in + // heap corruption. A typical way to address this issue is by + // having a card table. + // This aspect of the test is meant to ensure that card + // dirtying works and that we check the marked cards after + // marking. + // If these operations are not done, a segfault / failed assert + // should occur. + for (int j = 0; j < l.length; ++j) { + int a = l.length - i - 1; + int b = rnd.nextInt(a); + byte[] temp = l[a].bytes; + l[a].bytes = l[b].bytes; + l[b].bytes = temp; + } + } + } catch (OutOfMemoryError e) { + } + System.out.println("Test complete"); + } +} |