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");