Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp @ 6610:f99a36499b8c
7192128: G1: Extend fix for 6948537 to G1's BOT
Summary: G1 does not appear to be immune to the issue described in CR 6948537 and increasing the size of old-generation PLABs appears to increase the liklihood of seeing the issue. Extend the fix for 6948537 to G1's BlockOffsetTable.
Reviewed-by: brutisso, jmasa
author | johnc |
---|---|
date | Tue, 21 Aug 2012 10:05:57 -0700 |
parents | d2a62e0f25eb |
children | 2fc0334f613a |
comparison
equal
deleted
inserted
replaced
6597:3958f0acde31 | 6610:f99a36499b8c |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
157 void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) { | 157 void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) { |
158 assert(index_for(right - 1) < _vs.committed_size(), | 158 assert(index_for(right - 1) < _vs.committed_size(), |
159 "right address out of range"); | 159 "right address out of range"); |
160 assert(left < right, "Heap addresses out of order"); | 160 assert(left < right, "Heap addresses out of order"); |
161 size_t num_cards = pointer_delta(right, left) >> LogN_words; | 161 size_t num_cards = pointer_delta(right, left) >> LogN_words; |
162 memset(&_offset_array[index_for(left)], offset, num_cards); | 162 if (UseMemSetInBOT) { |
163 memset(&_offset_array[index_for(left)], offset, num_cards); | |
164 } else { | |
165 size_t i = index_for(left); | |
166 const size_t end = i + num_cards; | |
167 for (; i < end; i++) { | |
168 _offset_array[i] = offset; | |
169 } | |
170 } | |
163 } | 171 } |
164 | 172 |
165 void set_offset_array(size_t left, size_t right, u_char offset) { | 173 void set_offset_array(size_t left, size_t right, u_char offset) { |
166 assert(right < _vs.committed_size(), "right address out of range"); | 174 assert(right < _vs.committed_size(), "right address out of range"); |
167 assert(left <= right, "indexes out of order"); | 175 assert(left <= right, "indexes out of order"); |
168 size_t num_cards = right - left + 1; | 176 size_t num_cards = right - left + 1; |
169 memset(&_offset_array[left], offset, num_cards); | 177 if (UseMemSetInBOT) { |
178 memset(&_offset_array[left], offset, num_cards); | |
179 } else { | |
180 size_t i = left; | |
181 const size_t end = i + num_cards; | |
182 for (; i < end; i++) { | |
183 _offset_array[i] = offset; | |
184 } | |
185 } | |
170 } | 186 } |
171 | 187 |
172 void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const { | 188 void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const { |
173 assert(index < _vs.committed_size(), "index out of range"); | 189 assert(index < _vs.committed_size(), "index out of range"); |
174 assert(high >= low, "addresses out of order"); | 190 assert(high >= low, "addresses out of order"); |