hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp

Print this page
rev 611 : Merge


 178 private:
 179   // Each bit in the bitmap represents one unit of 'object granularity.' Objects
 180   // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
 181   // granularity is 2, 64-bit is 1.
 182   static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
 183 
 184   HeapWord*       _region_start;
 185   size_t          _region_size;
 186   BitMap          _beg_bits;
 187   BitMap          _end_bits;
 188   PSVirtualSpace* _virtual_space;
 189 
 190 #ifndef PRODUCT
 191   size_t _cas_tries;
 192   size_t _cas_retries;
 193   size_t _cas_by_another;
 194 #endif  // #ifndef PRODUCT
 195 };
 196 
 197 inline ParMarkBitMap::ParMarkBitMap():
 198   _beg_bits(NULL, 0),
 199   _end_bits(NULL, 0)
 200 {
 201   _region_start = 0;
 202   _virtual_space = 0;
 203 }
 204 
 205 inline ParMarkBitMap::ParMarkBitMap(MemRegion covered_region): 
 206   _beg_bits(NULL, 0),
 207   _end_bits(NULL, 0)
 208 {
 209   initialize(covered_region);
 210 }
 211 
 212 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
 213 {
 214   _beg_bits.clear_range(beg, end);
 215   _end_bits.clear_range(beg, end);
 216 }
 217 
 218 inline ParMarkBitMap::idx_t
 219 ParMarkBitMap::bits_required(size_t words)
 220 {
 221   // Need two bits (one begin bit, one end bit) for each unit of 'object
 222   // granularity' in the heap.
 223   return words_to_bits(words * 2);
 224 }
 225 
 226 inline ParMarkBitMap::idx_t
 227 ParMarkBitMap::bits_required(MemRegion covered_region)


 311   return words / obj_granularity();
 312 }
 313 
 314 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
 315 {
 316   DEBUG_ONLY(verify_bit(beg_bit);)
 317   DEBUG_ONLY(verify_bit(end_bit);)
 318   return bits_to_words(end_bit - beg_bit + 1);
 319 }
 320 
 321 inline size_t
 322 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
 323 {
 324   DEBUG_ONLY(verify_addr(beg_addr);)
 325   DEBUG_ONLY(verify_addr(end_addr);)
 326   return pointer_delta(end_addr, beg_addr) + obj_granularity();
 327 }
 328 
 329 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
 330 {
 331   const idx_t end_bit = _end_bits.find_next_one_bit(beg_bit, size());
 332   assert(is_marked(beg_bit), "obj not marked");
 333   assert(end_bit < size(), "end bit missing");
 334   return obj_size(beg_bit, end_bit);
 335 }
 336 
 337 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
 338 {
 339   return obj_size(addr_to_bit(addr));
 340 }
 341 
 342 inline size_t ParMarkBitMap::obj_size(oop obj) const
 343 {
 344   return obj_size((HeapWord*)obj);
 345 }
 346 
 347 inline ParMarkBitMap::IterationStatus
 348 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
 349                        HeapWord* range_beg,
 350                        HeapWord* range_end) const
 351 {


 370   return mark_obj((HeapWord*)obj, (size_t)size);
 371 }
 372 
 373 inline BitMap::idx_t
 374 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
 375 {
 376   DEBUG_ONLY(verify_addr(addr);)
 377   return words_to_bits(pointer_delta(addr, region_start()));
 378 }
 379 
 380 inline HeapWord*
 381 ParMarkBitMap::bit_to_addr(idx_t bit) const
 382 {
 383   DEBUG_ONLY(verify_bit(bit);)
 384   return region_start() + bits_to_words(bit);
 385 }
 386 
 387 inline ParMarkBitMap::idx_t
 388 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
 389 {
 390   return _beg_bits.find_next_one_bit(beg, end);
 391 }
 392 
 393 inline ParMarkBitMap::idx_t
 394 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
 395 {
 396   return _end_bits.find_next_one_bit(beg, end);
 397 }
 398 
 399 inline HeapWord*
 400 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
 401 {
 402   const idx_t beg_bit = addr_to_bit(beg);
 403   const idx_t end_bit = addr_to_bit(end);
 404   const idx_t search_end = BitMap::word_align_up(end_bit);
 405   const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
 406   return bit_to_addr(res_bit);
 407 }
 408 
 409 inline HeapWord*
 410 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
 411 {
 412   const idx_t beg_bit = addr_to_bit(beg);
 413   const idx_t end_bit = addr_to_bit(end);
 414   const idx_t search_end = BitMap::word_align_up(end_bit);
 415   const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
 416   return bit_to_addr(res_bit);


 178 private:
 179   // Each bit in the bitmap represents one unit of 'object granularity.' Objects
 180   // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
 181   // granularity is 2, 64-bit is 1.
 182   static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
 183 
 184   HeapWord*       _region_start;
 185   size_t          _region_size;
 186   BitMap          _beg_bits;
 187   BitMap          _end_bits;
 188   PSVirtualSpace* _virtual_space;
 189 
 190 #ifndef PRODUCT
 191   size_t _cas_tries;
 192   size_t _cas_retries;
 193   size_t _cas_by_another;
 194 #endif  // #ifndef PRODUCT
 195 };
 196 
 197 inline ParMarkBitMap::ParMarkBitMap():
 198   _beg_bits(),
 199   _end_bits()
 200 {
 201   _region_start = 0;
 202   _virtual_space = 0;
 203 }
 204 
 205 inline ParMarkBitMap::ParMarkBitMap(MemRegion covered_region):
 206   _beg_bits(),
 207   _end_bits()
 208 {
 209   initialize(covered_region);
 210 }
 211 
 212 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
 213 {
 214   _beg_bits.clear_range(beg, end);
 215   _end_bits.clear_range(beg, end);
 216 }
 217 
 218 inline ParMarkBitMap::idx_t
 219 ParMarkBitMap::bits_required(size_t words)
 220 {
 221   // Need two bits (one begin bit, one end bit) for each unit of 'object
 222   // granularity' in the heap.
 223   return words_to_bits(words * 2);
 224 }
 225 
 226 inline ParMarkBitMap::idx_t
 227 ParMarkBitMap::bits_required(MemRegion covered_region)


 311   return words / obj_granularity();
 312 }
 313 
 314 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
 315 {
 316   DEBUG_ONLY(verify_bit(beg_bit);)
 317   DEBUG_ONLY(verify_bit(end_bit);)
 318   return bits_to_words(end_bit - beg_bit + 1);
 319 }
 320 
 321 inline size_t
 322 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
 323 {
 324   DEBUG_ONLY(verify_addr(beg_addr);)
 325   DEBUG_ONLY(verify_addr(end_addr);)
 326   return pointer_delta(end_addr, beg_addr) + obj_granularity();
 327 }
 328 
 329 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
 330 {
 331   const idx_t end_bit = _end_bits.get_next_one_offset_inline(beg_bit, size());
 332   assert(is_marked(beg_bit), "obj not marked");
 333   assert(end_bit < size(), "end bit missing");
 334   return obj_size(beg_bit, end_bit);
 335 }
 336 
 337 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
 338 {
 339   return obj_size(addr_to_bit(addr));
 340 }
 341 
 342 inline size_t ParMarkBitMap::obj_size(oop obj) const
 343 {
 344   return obj_size((HeapWord*)obj);
 345 }
 346 
 347 inline ParMarkBitMap::IterationStatus
 348 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
 349                        HeapWord* range_beg,
 350                        HeapWord* range_end) const
 351 {


 370   return mark_obj((HeapWord*)obj, (size_t)size);
 371 }
 372 
 373 inline BitMap::idx_t
 374 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
 375 {
 376   DEBUG_ONLY(verify_addr(addr);)
 377   return words_to_bits(pointer_delta(addr, region_start()));
 378 }
 379 
 380 inline HeapWord*
 381 ParMarkBitMap::bit_to_addr(idx_t bit) const
 382 {
 383   DEBUG_ONLY(verify_bit(bit);)
 384   return region_start() + bits_to_words(bit);
 385 }
 386 
 387 inline ParMarkBitMap::idx_t
 388 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
 389 {
 390   return _beg_bits.get_next_one_offset_inline_aligned_right(beg, end);
 391 }
 392 
 393 inline ParMarkBitMap::idx_t
 394 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
 395 {
 396   return _end_bits.get_next_one_offset_inline_aligned_right(beg, end);
 397 }
 398 
 399 inline HeapWord*
 400 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
 401 {
 402   const idx_t beg_bit = addr_to_bit(beg);
 403   const idx_t end_bit = addr_to_bit(end);
 404   const idx_t search_end = BitMap::word_align_up(end_bit);
 405   const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
 406   return bit_to_addr(res_bit);
 407 }
 408 
 409 inline HeapWord*
 410 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
 411 {
 412   const idx_t beg_bit = addr_to_bit(beg);
 413   const idx_t end_bit = addr_to_bit(end);
 414   const idx_t search_end = BitMap::word_align_up(end_bit);
 415   const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
 416   return bit_to_addr(res_bit);