86 HeapWord* CMBitMapRO::getNextUnmarkedWordAddress(HeapWord* addr,
87 HeapWord* limit) const {
88 size_t addrOffset = heapWordToOffset(addr);
89 if (limit == NULL) {
90 limit = _bmStartWord + _bmWordSize;
91 }
92 size_t limitOffset = heapWordToOffset(limit);
93 size_t nextOffset = _bm.get_next_zero_offset(addrOffset, limitOffset);
94 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
95 assert(nextAddr >= addr, "get_next_one postcondition");
96 assert(nextAddr == limit || !isMarked(nextAddr),
97 "get_next_one postcondition");
98 return nextAddr;
99 }
100
101 int CMBitMapRO::heapWordDiffToOffsetDiff(size_t diff) const {
102 assert((diff & ((1 << _shifter) - 1)) == 0, "argument check");
103 return (int) (diff >> _shifter);
104 }
105
106 bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
107 HeapWord* left = MAX2(_bmStartWord, mr.start());
108 HeapWord* right = MIN2(_bmStartWord + _bmWordSize, mr.end());
109 if (right > left) {
110 // Right-open interval [leftOffset, rightOffset).
111 return _bm.iterate(cl, heapWordToOffset(left), heapWordToOffset(right));
112 } else {
113 return true;
114 }
115 }
116
117 void CMBitMapRO::mostly_disjoint_range_union(BitMap* from_bitmap,
118 size_t from_start_index,
119 HeapWord* to_start_word,
120 size_t word_num) {
121 _bm.mostly_disjoint_range_union(from_bitmap,
122 from_start_index,
123 heapWordToOffset(to_start_word),
124 word_num);
125 }
126
127 #ifndef PRODUCT
128 bool CMBitMapRO::covers(ReservedSpace rs) const {
129 // assert(_bm.map() == _virtual_space.low(), "map inconsistency");
130 assert(((size_t)_bm.size() * (size_t)(1 << _shifter)) == _bmWordSize,
131 "size inconsistency");
132 return _bmStartWord == (HeapWord*)(rs.base()) &&
133 _bmWordSize == rs.size()>>LogHeapWordSize;
134 }
135 #endif
136
|
86 HeapWord* CMBitMapRO::getNextUnmarkedWordAddress(HeapWord* addr,
87 HeapWord* limit) const {
88 size_t addrOffset = heapWordToOffset(addr);
89 if (limit == NULL) {
90 limit = _bmStartWord + _bmWordSize;
91 }
92 size_t limitOffset = heapWordToOffset(limit);
93 size_t nextOffset = _bm.get_next_zero_offset(addrOffset, limitOffset);
94 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
95 assert(nextAddr >= addr, "get_next_one postcondition");
96 assert(nextAddr == limit || !isMarked(nextAddr),
97 "get_next_one postcondition");
98 return nextAddr;
99 }
100
101 int CMBitMapRO::heapWordDiffToOffsetDiff(size_t diff) const {
102 assert((diff & ((1 << _shifter) - 1)) == 0, "argument check");
103 return (int) (diff >> _shifter);
104 }
105
106 void CMBitMapRO::mostly_disjoint_range_union(BitMap* from_bitmap,
107 size_t from_start_index,
108 HeapWord* to_start_word,
109 size_t word_num) {
110 _bm.mostly_disjoint_range_union(from_bitmap,
111 from_start_index,
112 heapWordToOffset(to_start_word),
113 word_num);
114 }
115
116 #ifndef PRODUCT
117 bool CMBitMapRO::covers(ReservedSpace rs) const {
118 // assert(_bm.map() == _virtual_space.low(), "map inconsistency");
119 assert(((size_t)_bm.size() * (size_t)(1 << _shifter)) == _bmWordSize,
120 "size inconsistency");
121 return _bmStartWord == (HeapWord*)(rs.base()) &&
122 _bmWordSize == rs.size()>>LogHeapWordSize;
123 }
124 #endif
125
|