hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
changeset 17390 f6f515533813
parent 13963 e5b53c306fb5
child 17627 325871034f2c
equal deleted inserted replaced
17389:25ba661e4352 17390:f6f515533813
    22  *
    22  *
    23  */
    23  */
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp"
    26 #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp"
    27 #include "gc_implementation/parallelScavenge/parMarkBitMap.inline.hpp"
       
    28 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
    27 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
    29 #include "oops/oop.inline.hpp"
    28 #include "oops/oop.inline.hpp"
    30 #include "runtime/os.hpp"
    29 #include "runtime/os.hpp"
    31 #include "utilities/bitMap.inline.hpp"
    30 #include "utilities/bitMap.inline.hpp"
    32 #include "services/memTracker.hpp"
    31 #include "services/memTracker.hpp"
   106     return true;
   105     return true;
   107   }
   106   }
   108   return false;
   107   return false;
   109 }
   108 }
   110 
   109 
   111 size_t
       
   112 ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, HeapWord* end_addr) const
       
   113 {
       
   114   assert(beg_addr <= end_addr, "bad range");
       
   115 
       
   116   idx_t live_bits = 0;
       
   117 
       
   118   // The bitmap routines require the right boundary to be word-aligned.
       
   119   const idx_t end_bit = addr_to_bit(end_addr);
       
   120   const idx_t range_end = BitMap::word_align_up(end_bit);
       
   121 
       
   122   idx_t beg_bit = find_obj_beg(addr_to_bit(beg_addr), range_end);
       
   123   while (beg_bit < end_bit) {
       
   124     idx_t tmp_end = find_obj_end(beg_bit, range_end);
       
   125     if (tmp_end < end_bit) {
       
   126       live_bits += tmp_end - beg_bit + 1;
       
   127       beg_bit = find_obj_beg(tmp_end + 1, range_end);
       
   128     } else {
       
   129       live_bits += end_bit - beg_bit;  // No + 1 here; end_bit is not counted.
       
   130       return bits_to_words(live_bits);
       
   131     }
       
   132   }
       
   133   return bits_to_words(live_bits);
       
   134 }
       
   135 
       
   136 size_t ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, oop end_obj) const
   110 size_t ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, oop end_obj) const
   137 {
   111 {
   138   assert(beg_addr <= (HeapWord*)end_obj, "bad range");
   112   assert(beg_addr <= (HeapWord*)end_obj, "bad range");
   139   assert(is_marked(end_obj), "end_obj must be live");
   113   assert(is_marked(end_obj), "end_obj must be live");
   140 
   114 
   242 
   216 
   243   live_closure->set_source(bit_to_addr(range_end));
   217   live_closure->set_source(bit_to_addr(range_end));
   244   return complete;
   218   return complete;
   245 }
   219 }
   246 
   220 
   247 #ifndef PRODUCT
       
   248 void ParMarkBitMap::reset_counters()
       
   249 {
       
   250   _cas_tries = _cas_retries = _cas_by_another = 0;
       
   251 }
       
   252 #endif  // #ifndef PRODUCT
       
   253 
       
   254 #ifdef ASSERT
   221 #ifdef ASSERT
   255 void ParMarkBitMap::verify_clear() const
   222 void ParMarkBitMap::verify_clear() const
   256 {
   223 {
   257   const idx_t* const beg = (const idx_t*)_virtual_space->committed_low_addr();
   224   const idx_t* const beg = (const idx_t*)_virtual_space->committed_low_addr();
   258   const idx_t* const end = (const idx_t*)_virtual_space->committed_high_addr();
   225   const idx_t* const end = (const idx_t*)_virtual_space->committed_high_addr();