1bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier/* 2bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * Copyright (C) 2012 The Android Open Source Project 3bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * 4bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * you may not use this file except in compliance with the License. 6bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * You may obtain a copy of the License at 7bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * 8bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * 10bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * Unless required by applicable law or agreed to in writing, software 11bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * See the License for the specific language governing permissions and 14bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier * limitations under the License. 15bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier */ 16bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 17bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartierimport java.util.Random; 18bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 19ffb5600d2b9ebb045d0db7020599a198d39d08c0Ian Rogerspublic class Main { 20bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier private static final int buckets = 16 * 1024; 21bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier private static final int bufferSize = 1024; 22bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 23bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier static class ByteContainer { 24bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier public byte[] bytes; 25bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier } 26bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 27bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier public static void main(String[] args) throws Exception { 2835c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers ByteContainer[] l = new ByteContainer[buckets]; 29bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 3035c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers for (int i = 0; i < buckets; ++i) { 3135c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers l[i] = new ByteContainer(); 3235c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers } 33bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 3435c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers Random rnd = new Random(123456); 3535c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers for (int i = 0; i < buckets / 256; ++i) { 3635c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers int index = rnd.nextInt(buckets); 3735c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers l[index].bytes = new byte[bufferSize]; 38bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 3935c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // Try to get GC to run if we can 4035c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers Runtime.getRuntime().gc(); 41bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier 4235c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // Shuffle the array to try cause the lost object problem: 4335c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // This problem occurs when an object is white, it may be 4435c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // only referenced from a white or grey object. If the white 4535c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // object is moved during a CMS to be a black object's field, it 4635c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // causes the moved object to not get marked. This can result in 4735c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // heap corruption. A typical way to address this issue is by 4835c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // having a card table. 4935c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // This aspect of the test is meant to ensure that card 5035c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // dirtying works and that we check the marked cards after 5135c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // marking. 5235c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // If these operations are not done, a segfault / failed assert 5335c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers // should occur. 5435c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers for (int j = 0; j < l.length; ++j) { 5535c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers int a = l.length - i - 1; 5635c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers int b = rnd.nextInt(a); 5735c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers byte[] temp = l[a].bytes; 5835c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers l[a].bytes = l[b].bytes; 5935c360ec8ac11f6298c94eaadc6b534edf59e370Ian Rogers l[b].bytes = temp; 60bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier } 61bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier } 62ffb5600d2b9ebb045d0db7020599a198d39d08c0Ian Rogers System.out.println("Test complete"); 63bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier } 64bba47a499beac418d3fc933acd6d4fe01dcaa3cbMathieu Chartier} 65