inline void CMSBitMap::par_markRange(MemRegion mr) { assert_locked(); mr = mr.intersection(MemRegion(_bmStartWord, _bmWordSize)); assert(!mr.is_empty(), "unexpected empty region"); // convert address range into offset range size_t start_ofs = heapWordToOffset(mr.start()); size_t end_ofs = heapWordToOffset(mr.end()); // Range size is usually just 1 bit. _bm.par_set_range(start_ofs, end_ofs, BitMap::small_range); }
void ContiguousSpace::oop_iterate(MemRegion mr, OopClosure* blk) { if (is_empty()) { return; } MemRegion cur = MemRegion(bottom(), top()); mr = mr.intersection(cur); if (mr.is_empty()) { return; } if (mr.equals(cur)) { oop_iterate(blk); return; } assert(mr.end() <= top(), "just took an intersection above"); HeapWord* obj_addr = block_start(mr.start()); HeapWord* t = mr.end(); // Handle first object specially. oop obj = oop(obj_addr); SpaceMemRegionOopsIterClosure smr_blk(blk, mr); obj_addr += obj->oop_iterate(&smr_blk); while (obj_addr < t) { oop obj = oop(obj_addr); assert(obj->is_oop(), "expected an oop"); obj_addr += obj->size(); // If "obj_addr" is not greater than top, then the // entire object "obj" is within the region. if (obj_addr <= t) { obj->oop_iterate(blk); } else { // "obj" extends beyond end of region obj->oop_iterate(&smr_blk); break; } }; }
void CardTableRS::clear(MemRegion mr) { for (int i = 0; i < _ct_bs._cur_covered_regions; i++) { MemRegion mri = mr.intersection(_ct_bs._covered[i]); if (mri.byte_size() > 0) clear_MemRegion(mri); } }