src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp

changeset 3454
2e966d967c5c
parent 3416
2ace1c4ee8da
child 3463
d30fa85f9994
     1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp	Fri Jan 13 01:55:22 2012 -0800
     1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp	Fri Jan 13 13:27:48 2012 -0800
     1.3 @@ -28,6 +28,35 @@
     1.4  #include "gc_implementation/g1/concurrentMark.hpp"
     1.5  #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
     1.6  
     1.7 +inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
     1.8 +  HeapWord* start_addr = MAX2(startWord(), mr.start());
     1.9 +  HeapWord* end_addr = MIN2(endWord(), mr.end());
    1.10 +
    1.11 +  if (end_addr > start_addr) {
    1.12 +    // Right-open interval [start-offset, end-offset).
    1.13 +    BitMap::idx_t start_offset = heapWordToOffset(start_addr);
    1.14 +    BitMap::idx_t end_offset = heapWordToOffset(end_addr);
    1.15 +
    1.16 +    start_offset = _bm.get_next_one_offset(start_offset, end_offset);
    1.17 +    while (start_offset < end_offset) {
    1.18 +      HeapWord* obj_addr = offsetToHeapWord(start_offset);
    1.19 +      oop obj = (oop) obj_addr;
    1.20 +      if (!cl->do_bit(start_offset)) {
    1.21 +        return false;
    1.22 +      }
    1.23 +      HeapWord* next_addr = MIN2(obj_addr + obj->size(), end_addr);
    1.24 +      BitMap::idx_t next_offset = heapWordToOffset(next_addr);
    1.25 +      start_offset = _bm.get_next_one_offset(next_offset, end_offset);
    1.26 +    }
    1.27 +  }
    1.28 +  return true;
    1.29 +}
    1.30 +
    1.31 +inline bool CMBitMapRO::iterate(BitMapClosure* cl) {
    1.32 +  MemRegion mr(startWord(), sizeInWords());
    1.33 +  return iterate(cl, mr);
    1.34 +}
    1.35 +
    1.36  inline void CMTask::push(oop obj) {
    1.37    HeapWord* objAddr = (HeapWord*) obj;
    1.38    assert(_g1h->is_in_g1_reserved(objAddr), "invariant");

mercurial