50 // that compilers might normally perform in the case of non-G1 |
50 // that compilers might normally perform in the case of non-G1 |
51 // collectors needs to be carefully investigated prior to any such |
51 // collectors needs to be carefully investigated prior to any such |
52 // consolidation. |
52 // consolidation. |
53 |
53 |
54 // Forward declarations |
54 // Forward declarations |
55 class ContiguousSpace; |
|
56 class G1BlockOffsetSharedArray; |
55 class G1BlockOffsetSharedArray; |
|
56 class G1OffsetTableContigSpace; |
57 |
57 |
58 class G1BlockOffsetTable VALUE_OBJ_CLASS_SPEC { |
58 class G1BlockOffsetTable VALUE_OBJ_CLASS_SPEC { |
59 friend class VMStructs; |
59 friend class VMStructs; |
60 protected: |
60 protected: |
61 // These members describe the region covered by the table. |
61 // These members describe the region covered by the table. |
155 u_char offset_array(size_t index) const { |
155 u_char offset_array(size_t index) const { |
156 check_index(index, "index out of range"); |
156 check_index(index, "index out of range"); |
157 return _offset_array[index]; |
157 return _offset_array[index]; |
158 } |
158 } |
159 |
159 |
|
160 void set_offset_array(HeapWord* left, HeapWord* right, u_char offset); |
|
161 |
160 void set_offset_array(size_t index, u_char offset) { |
162 void set_offset_array(size_t index, u_char offset) { |
161 check_index(index, "index out of range"); |
163 check_index(index, "index out of range"); |
162 check_offset(offset, "offset too large"); |
164 check_offset(offset, "offset too large"); |
163 _offset_array[index] = offset; |
165 _offset_array[index] = offset; |
164 } |
166 } |
166 void set_offset_array(size_t index, HeapWord* high, HeapWord* low) { |
168 void set_offset_array(size_t index, HeapWord* high, HeapWord* low) { |
167 check_index(index, "index out of range"); |
169 check_index(index, "index out of range"); |
168 assert(high >= low, "addresses out of order"); |
170 assert(high >= low, "addresses out of order"); |
169 check_offset(pointer_delta(high, low), "offset too large"); |
171 check_offset(pointer_delta(high, low), "offset too large"); |
170 _offset_array[index] = (u_char) pointer_delta(high, low); |
172 _offset_array[index] = (u_char) pointer_delta(high, low); |
171 } |
|
172 |
|
173 void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) { |
|
174 check_index(index_for(right - 1), "right address out of range"); |
|
175 assert(left < right, "Heap addresses out of order"); |
|
176 size_t num_cards = pointer_delta(right, left) >> LogN_words; |
|
177 if (UseMemSetInBOT) { |
|
178 memset(&_offset_array[index_for(left)], offset, num_cards); |
|
179 } else { |
|
180 size_t i = index_for(left); |
|
181 const size_t end = i + num_cards; |
|
182 for (; i < end; i++) { |
|
183 _offset_array[i] = offset; |
|
184 } |
|
185 } |
|
186 } |
173 } |
187 |
174 |
188 void set_offset_array(size_t left, size_t right, u_char offset) { |
175 void set_offset_array(size_t left, size_t right, u_char offset) { |
189 check_index(right, "right index out of range"); |
176 check_index(right, "right index out of range"); |
190 assert(left <= right, "indexes out of order"); |
177 assert(left <= right, "indexes out of order"); |
279 // This is the array, which can be shared by several BlockOffsetArray's |
266 // This is the array, which can be shared by several BlockOffsetArray's |
280 // servicing different |
267 // servicing different |
281 G1BlockOffsetSharedArray* _array; |
268 G1BlockOffsetSharedArray* _array; |
282 |
269 |
283 // The space that owns this subregion. |
270 // The space that owns this subregion. |
284 Space* _sp; |
271 G1OffsetTableContigSpace* _gsp; |
285 |
|
286 // If "_sp" is a contiguous space, the field below is the view of "_sp" |
|
287 // as a contiguous space, else NULL. |
|
288 ContiguousSpace* _csp; |
|
289 |
272 |
290 // If true, array entries are initialized to 0; otherwise, they are |
273 // If true, array entries are initialized to 0; otherwise, they are |
291 // initialized to point backwards to the beginning of the covered region. |
274 // initialized to point backwards to the beginning of the covered region. |
292 bool _init_to_zero; |
275 bool _init_to_zero; |
293 |
276 |
308 // A helper function for BOT adjustment/verification work |
291 // A helper function for BOT adjustment/verification work |
309 void do_block_internal(HeapWord* blk_start, HeapWord* blk_end, Action action); |
292 void do_block_internal(HeapWord* blk_start, HeapWord* blk_end, Action action); |
310 |
293 |
311 protected: |
294 protected: |
312 |
295 |
313 ContiguousSpace* csp() const { return _csp; } |
296 G1OffsetTableContigSpace* gsp() const { return _gsp; } |
|
297 |
|
298 inline size_t block_size(const HeapWord* p) const; |
314 |
299 |
315 // Returns the address of a block whose start is at most "addr". |
300 // Returns the address of a block whose start is at most "addr". |
316 // If "has_max_index" is true, "assumes "max_index" is the last valid one |
301 // If "has_max_index" is true, "assumes "max_index" is the last valid one |
317 // in the array. |
302 // in the array. |
318 inline HeapWord* block_at_or_preceding(const void* addr, |
303 inline HeapWord* block_at_or_preceding(const void* addr, |
361 |
346 |
362 // Note: this ought to be part of the constructor, but that would require |
347 // Note: this ought to be part of the constructor, but that would require |
363 // "this" to be passed as a parameter to a member constructor for |
348 // "this" to be passed as a parameter to a member constructor for |
364 // the containing concrete subtype of Space. |
349 // the containing concrete subtype of Space. |
365 // This would be legal C++, but MS VC++ doesn't allow it. |
350 // This would be legal C++, but MS VC++ doesn't allow it. |
366 void set_space(Space* sp); |
351 void set_space(G1OffsetTableContigSpace* sp); |
367 |
352 |
368 // Resets the covered region to the given "mr". |
353 // Resets the covered region to the given "mr". |
369 void set_region(MemRegion mr); |
354 void set_region(MemRegion mr); |
370 |
355 |
371 // Resets the covered region to one with the same _bottom as before but |
356 // Resets the covered region to one with the same _bottom as before but |