Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp @ 20542:0fcaab91d485
8055816: Remove dead code in g1BlockOffsetTable
Reviewed-by: tschatzl, mgerdin
author | brutisso |
---|---|
date | Fri, 10 Oct 2014 15:45:45 +0200 |
parents | 1f1d373cd044 |
children | e7d0505c8a30 |
comparison
equal
deleted
inserted
replaced
20541:e3ed86fc15ed | 20542:0fcaab91d485 |
---|---|
107 inline HeapWord* block_start_const(const void* addr) const; | 107 inline HeapWord* block_start_const(const void* addr) const; |
108 }; | 108 }; |
109 | 109 |
110 class G1BlockOffsetSharedArrayMappingChangedListener : public G1MappingChangedListener { | 110 class G1BlockOffsetSharedArrayMappingChangedListener : public G1MappingChangedListener { |
111 public: | 111 public: |
112 virtual void on_commit(uint start_idx, size_t num_regions); | 112 virtual void on_commit(uint start_idx, size_t num_regions) { |
113 // Nothing to do. The BOT is hard-wired to be part of the HeapRegion, and we cannot | |
114 // retrieve it here since this would cause firing of several asserts. The code | |
115 // executed after commit of a region already needs to do some re-initialization of | |
116 // the HeapRegion, so we combine that. | |
117 } | |
113 }; | 118 }; |
114 | 119 |
115 // This implementation of "G1BlockOffsetTable" divides the covered region | 120 // This implementation of "G1BlockOffsetTable" divides the covered region |
116 // into "N"-word subregions (where "N" = 2^"LogN". An array with an entry | 121 // into "N"-word subregions (where "N" = 2^"LogN". An array with an entry |
117 // for each such subregion indicates how far back one must go to find the | 122 // for each such subregion indicates how far back one must go to find the |
151 | 156 |
152 // Bounds checking accessors: | 157 // Bounds checking accessors: |
153 // For performance these have to devolve to array accesses in product builds. | 158 // For performance these have to devolve to array accesses in product builds. |
154 inline u_char offset_array(size_t index) const; | 159 inline u_char offset_array(size_t index) const; |
155 | 160 |
156 void set_offset_array(HeapWord* left, HeapWord* right, u_char offset); | |
157 | |
158 void set_offset_array_raw(size_t index, u_char offset) { | 161 void set_offset_array_raw(size_t index, u_char offset) { |
159 _offset_array[index] = offset; | 162 _offset_array[index] = offset; |
160 } | 163 } |
161 | 164 |
162 inline void set_offset_array(size_t index, u_char offset); | 165 inline void set_offset_array(size_t index, u_char offset); |
163 | 166 |
164 inline void set_offset_array(size_t index, HeapWord* high, HeapWord* low); | 167 inline void set_offset_array(size_t index, HeapWord* high, HeapWord* low); |
165 | 168 |
166 inline void set_offset_array(size_t left, size_t right, u_char offset); | 169 inline void set_offset_array(size_t left, size_t right, u_char offset); |
167 | |
168 inline void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const; | |
169 | 170 |
170 bool is_card_boundary(HeapWord* p) const; | 171 bool is_card_boundary(HeapWord* p) const; |
171 | 172 |
172 public: | 173 public: |
173 | 174 |
190 // (see "resize" below) up to the size of "_reserved" (which must be at | 191 // (see "resize" below) up to the size of "_reserved" (which must be at |
191 // least "init_word_size".) The contents of the initial table are | 192 // least "init_word_size".) The contents of the initial table are |
192 // undefined; it is the responsibility of the constituent | 193 // undefined; it is the responsibility of the constituent |
193 // G1BlockOffsetTable(s) to initialize cards. | 194 // G1BlockOffsetTable(s) to initialize cards. |
194 G1BlockOffsetSharedArray(MemRegion heap, G1RegionToSpaceMapper* storage); | 195 G1BlockOffsetSharedArray(MemRegion heap, G1RegionToSpaceMapper* storage); |
195 | |
196 void set_bottom(HeapWord* new_bottom); | |
197 | 196 |
198 // Return the appropriate index into "_offset_array" for "p". | 197 // Return the appropriate index into "_offset_array" for "p". |
199 inline size_t index_for(const void* p) const; | 198 inline size_t index_for(const void* p) const; |
200 inline size_t index_for_raw(const void* p) const; | 199 inline size_t index_for_raw(const void* p) const; |
201 | 200 |
218 enum SomePrivateConstants { | 217 enum SomePrivateConstants { |
219 N_words = G1BlockOffsetSharedArray::N_words, | 218 N_words = G1BlockOffsetSharedArray::N_words, |
220 LogN = G1BlockOffsetSharedArray::LogN | 219 LogN = G1BlockOffsetSharedArray::LogN |
221 }; | 220 }; |
222 | 221 |
223 // The following enums are used by do_block_helper | |
224 enum Action { | |
225 Action_single, // BOT records a single block (see single_block()) | |
226 Action_mark, // BOT marks the start of a block (see mark_block()) | |
227 Action_check // Check that BOT records block correctly | |
228 // (see verify_single_block()). | |
229 }; | |
230 | |
231 // This is the array, which can be shared by several BlockOffsetArray's | 222 // This is the array, which can be shared by several BlockOffsetArray's |
232 // servicing different | 223 // servicing different |
233 G1BlockOffsetSharedArray* _array; | 224 G1BlockOffsetSharedArray* _array; |
234 | 225 |
235 // The space that owns this subregion. | 226 // The space that owns this subregion. |
236 G1OffsetTableContigSpace* _gsp; | 227 G1OffsetTableContigSpace* _gsp; |
237 | |
238 // If true, array entries are initialized to 0; otherwise, they are | |
239 // initialized to point backwards to the beginning of the covered region. | |
240 bool _init_to_zero; | |
241 | 228 |
242 // The portion [_unallocated_block, _sp.end()) of the space that | 229 // The portion [_unallocated_block, _sp.end()) of the space that |
243 // is a single block known not to contain any objects. | 230 // is a single block known not to contain any objects. |
244 // NOTE: See BlockOffsetArrayUseUnallocatedBlock flag. | 231 // NOTE: See BlockOffsetArrayUseUnallocatedBlock flag. |
245 HeapWord* _unallocated_block; | 232 HeapWord* _unallocated_block; |
250 // is right-open. | 237 // is right-open. |
251 void set_remainder_to_point_to_start(HeapWord* start, HeapWord* end); | 238 void set_remainder_to_point_to_start(HeapWord* start, HeapWord* end); |
252 // Same as above, except that the args here are a card _index_ interval | 239 // Same as above, except that the args here are a card _index_ interval |
253 // that is closed: [start_index, end_index] | 240 // that is closed: [start_index, end_index] |
254 void set_remainder_to_point_to_start_incl(size_t start, size_t end); | 241 void set_remainder_to_point_to_start_incl(size_t start, size_t end); |
255 | |
256 // A helper function for BOT adjustment/verification work | |
257 void do_block_internal(HeapWord* blk_start, HeapWord* blk_end, Action action); | |
258 | 242 |
259 protected: | 243 protected: |
260 | 244 |
261 G1OffsetTableContigSpace* gsp() const { return _gsp; } | 245 G1OffsetTableContigSpace* gsp() const { return _gsp; } |
262 | 246 |
301 void alloc_block_work2(HeapWord** threshold_, size_t* index_, | 285 void alloc_block_work2(HeapWord** threshold_, size_t* index_, |
302 HeapWord* blk_start, HeapWord* blk_end); | 286 HeapWord* blk_start, HeapWord* blk_end); |
303 | 287 |
304 public: | 288 public: |
305 // The space may not have it's bottom and top set yet, which is why the | 289 // The space may not have it's bottom and top set yet, which is why the |
306 // region is passed as a parameter. If "init_to_zero" is true, the | 290 // region is passed as a parameter. The elements of the array are |
307 // elements of the array are initialized to zero. Otherwise, they are | 291 // initialized to zero. |
308 // initialized to point backwards to the beginning. | 292 G1BlockOffsetArray(G1BlockOffsetSharedArray* array, MemRegion mr); |
309 G1BlockOffsetArray(G1BlockOffsetSharedArray* array, MemRegion mr, | |
310 bool init_to_zero); | |
311 | 293 |
312 // Note: this ought to be part of the constructor, but that would require | 294 // Note: this ought to be part of the constructor, but that would require |
313 // "this" to be passed as a parameter to a member constructor for | 295 // "this" to be passed as a parameter to a member constructor for |
314 // the containing concrete subtype of Space. | 296 // the containing concrete subtype of Space. |
315 // This would be legal C++, but MS VC++ doesn't allow it. | 297 // This would be legal C++, but MS VC++ doesn't allow it. |
316 void set_space(G1OffsetTableContigSpace* sp); | 298 void set_space(G1OffsetTableContigSpace* sp); |
317 | 299 |
318 // Resets the covered region to the given "mr". | |
319 void set_region(MemRegion mr); | |
320 | |
321 // Resets the covered region to one with the same _bottom as before but | 300 // Resets the covered region to one with the same _bottom as before but |
322 // the "new_word_size". | 301 // the "new_word_size". |
323 void resize(size_t new_word_size); | 302 void resize(size_t new_word_size); |
324 | 303 |
325 // These must be guaranteed to work properly (i.e., do nothing) | |
326 // when "blk_start" ("blk" for second version) is "NULL". | |
327 virtual void alloc_block(HeapWord* blk_start, HeapWord* blk_end); | |
328 virtual void alloc_block(HeapWord* blk, size_t size) { | |
329 alloc_block(blk, blk + size); | |
330 } | |
331 | |
332 // The following methods are useful and optimized for a | |
333 // general, non-contiguous space. | |
334 | |
335 // Given a block [blk_start, blk_start + full_blk_size), and | |
336 // a left_blk_size < full_blk_size, adjust the BOT to show two | |
337 // blocks [blk_start, blk_start + left_blk_size) and | |
338 // [blk_start + left_blk_size, blk_start + full_blk_size). | |
339 // It is assumed (and verified in the non-product VM) that the | |
340 // BOT was correct for the original block. | |
341 void split_block(HeapWord* blk_start, size_t full_blk_size, | |
342 size_t left_blk_size); | |
343 | |
344 // Adjust the BOT to show that it has a single block in the | |
345 // range [blk_start, blk_start + size). All necessary BOT | |
346 // cards are adjusted, but _unallocated_block isn't. | |
347 void single_block(HeapWord* blk_start, HeapWord* blk_end); | |
348 void single_block(HeapWord* blk, size_t size) { | |
349 single_block(blk, blk + size); | |
350 } | |
351 | |
352 // Adjust BOT to show that it has a block in the range | |
353 // [blk_start, blk_start + size). Only the first card | |
354 // of BOT is touched. It is assumed (and verified in the | |
355 // non-product VM) that the remaining cards of the block | |
356 // are correct. | |
357 void mark_block(HeapWord* blk_start, HeapWord* blk_end); | |
358 void mark_block(HeapWord* blk, size_t size) { | |
359 mark_block(blk, blk + size); | |
360 } | |
361 | |
362 // Adjust _unallocated_block to indicate that a particular | |
363 // block has been newly allocated or freed. It is assumed (and | |
364 // verified in the non-product VM) that the BOT is correct for | |
365 // the given block. | |
366 inline void allocated(HeapWord* blk_start, HeapWord* blk_end) { | |
367 // Verify that the BOT shows [blk, blk + blk_size) to be one block. | |
368 verify_single_block(blk_start, blk_end); | |
369 if (BlockOffsetArrayUseUnallocatedBlock) { | |
370 _unallocated_block = MAX2(_unallocated_block, blk_end); | |
371 } | |
372 } | |
373 | |
374 inline void allocated(HeapWord* blk, size_t size) { | |
375 allocated(blk, blk + size); | |
376 } | |
377 | |
378 inline void freed(HeapWord* blk_start, HeapWord* blk_end); | |
379 | |
380 inline void freed(HeapWord* blk, size_t size); | |
381 | |
382 virtual HeapWord* block_start_unsafe(const void* addr); | 304 virtual HeapWord* block_start_unsafe(const void* addr); |
383 virtual HeapWord* block_start_unsafe_const(const void* addr) const; | 305 virtual HeapWord* block_start_unsafe_const(const void* addr) const; |
384 | |
385 // Requires "addr" to be the start of a card and returns the | |
386 // start of the block that contains the given address. | |
387 HeapWord* block_start_careful(const void* addr) const; | |
388 | |
389 // If true, initialize array slots with no allocated blocks to zero. | |
390 // Otherwise, make them point back to the front. | |
391 bool init_to_zero() { return _init_to_zero; } | |
392 | |
393 // Verification & debugging - ensure that the offset table reflects the fact | |
394 // that the block [blk_start, blk_end) or [blk, blk + size) is a | |
395 // single block of storage. NOTE: can;t const this because of | |
396 // call to non-const do_block_internal() below. | |
397 inline void verify_single_block(HeapWord* blk_start, HeapWord* blk_end) { | |
398 if (VerifyBlockOffsetArray) { | |
399 do_block_internal(blk_start, blk_end, Action_check); | |
400 } | |
401 } | |
402 | |
403 inline void verify_single_block(HeapWord* blk, size_t size) { | |
404 verify_single_block(blk, blk + size); | |
405 } | |
406 | 306 |
407 // Used by region verification. Checks that the contents of the | 307 // Used by region verification. Checks that the contents of the |
408 // BOT reflect that there's a single object that spans the address | 308 // BOT reflect that there's a single object that spans the address |
409 // range [obj_start, obj_start + word_size); returns true if this is | 309 // range [obj_start, obj_start + word_size); returns true if this is |
410 // the case, returns false if it's not. | 310 // the case, returns false if it's not. |
411 bool verify_for_object(HeapWord* obj_start, size_t word_size) const; | 311 bool verify_for_object(HeapWord* obj_start, size_t word_size) const; |
412 | 312 |
413 // Verify that the given block is before _unallocated_block | |
414 inline void verify_not_unallocated(HeapWord* blk_start, | |
415 HeapWord* blk_end) const { | |
416 if (BlockOffsetArrayUseUnallocatedBlock) { | |
417 assert(blk_start < blk_end, "Block inconsistency?"); | |
418 assert(blk_end <= _unallocated_block, "_unallocated_block problem"); | |
419 } | |
420 } | |
421 | |
422 inline void verify_not_unallocated(HeapWord* blk, size_t size) const { | |
423 verify_not_unallocated(blk, blk + size); | |
424 } | |
425 | |
426 void check_all_cards(size_t left_card, size_t right_card) const; | 313 void check_all_cards(size_t left_card, size_t right_card) const; |
427 | 314 |
428 virtual void print_on(outputStream* out) PRODUCT_RETURN; | 315 virtual void print_on(outputStream* out) PRODUCT_RETURN; |
429 }; | 316 }; |
430 | 317 |
443 void alloc_block_work1(HeapWord* blk_start, HeapWord* blk_end) { | 330 void alloc_block_work1(HeapWord* blk_start, HeapWord* blk_end) { |
444 alloc_block_work2(&_next_offset_threshold, &_next_offset_index, | 331 alloc_block_work2(&_next_offset_threshold, &_next_offset_index, |
445 blk_start, blk_end); | 332 blk_start, blk_end); |
446 } | 333 } |
447 | 334 |
448 // Variant of zero_bottom_entry that does not check for availability of the | 335 // Zero out the entry for _bottom (offset will be zero). Does not check for availability of the |
449 // memory first. | 336 // memory first. |
450 void zero_bottom_entry_raw(); | 337 void zero_bottom_entry_raw(); |
451 // Variant of initialize_threshold that does not check for availability of the | 338 // Variant of initialize_threshold that does not check for availability of the |
452 // memory first. | 339 // memory first. |
453 HeapWord* initialize_threshold_raw(); | 340 HeapWord* initialize_threshold_raw(); |
454 // Zero out the entry for _bottom (offset will be zero). | |
455 void zero_bottom_entry(); | |
456 public: | 341 public: |
457 G1BlockOffsetArrayContigSpace(G1BlockOffsetSharedArray* array, MemRegion mr); | 342 G1BlockOffsetArrayContigSpace(G1BlockOffsetSharedArray* array, MemRegion mr); |
458 | 343 |
459 // Initialize the threshold to reflect the first boundary after the | 344 // Initialize the threshold to reflect the first boundary after the |
460 // bottom of the covered region. | 345 // bottom of the covered region. |