99 }
100
101 inline ParMarkBitMap::idx_t ParMarkBitMap::align_range_end(idx_t range_end) const {
102 // size is aligned, so if range_end <= size then so is aligned result.
103 assert(range_end <= size(), "range end out of range");
104 return align_up(range_end, BitsPerWord);
105 }
106
107 inline HeapWord* ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const {
108 const idx_t beg_bit = addr_to_bit(beg);
109 const idx_t end_bit = addr_to_bit(end);
110 const idx_t search_end = align_range_end(end_bit);
111 const idx_t res_bit = MIN2(_beg_bits.find_first_set_bit_aligned_right(beg_bit, search_end),
112 end_bit);
113 return bit_to_addr(res_bit);
114 }
115
116 inline HeapWord* ParMarkBitMap::find_obj_beg_reverse(HeapWord* beg, HeapWord* end) const {
117 const idx_t beg_bit = addr_to_bit(beg);
118 const idx_t end_bit = addr_to_bit(end);
119 const idx_t res_bit = _beg_bits.find_last_set_bit_aligned_left(beg_bit, end_bit);
120 return bit_to_addr(res_bit);
121 }
122
123 #ifdef ASSERT
124 inline void ParMarkBitMap::verify_bit(idx_t bit) const {
125 // Allow one past the last valid bit; useful for loop bounds.
126 assert(bit <= _beg_bits.size(), "bit out of range");
127 }
128
129 inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
130 // Allow one past the last valid address; useful for loop bounds.
131 assert(addr >= heap_start(),
132 "addr too small, addr: " PTR_FORMAT " heap start: " PTR_FORMAT, p2i(addr), p2i(heap_start()));
133 assert(addr <= heap_end(),
134 "addr too big, addr: " PTR_FORMAT " heap end: " PTR_FORMAT, p2i(addr), p2i(heap_end()));
135 }
136 #endif // #ifdef ASSERT
137
138 #endif // SHARE_GC_PARALLEL_PARMARKBITMAP_INLINE_HPP
|
99 }
100
101 inline ParMarkBitMap::idx_t ParMarkBitMap::align_range_end(idx_t range_end) const {
102 // size is aligned, so if range_end <= size then so is aligned result.
103 assert(range_end <= size(), "range end out of range");
104 return align_up(range_end, BitsPerWord);
105 }
106
107 inline HeapWord* ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const {
108 const idx_t beg_bit = addr_to_bit(beg);
109 const idx_t end_bit = addr_to_bit(end);
110 const idx_t search_end = align_range_end(end_bit);
111 const idx_t res_bit = MIN2(_beg_bits.find_first_set_bit_aligned_right(beg_bit, search_end),
112 end_bit);
113 return bit_to_addr(res_bit);
114 }
115
116 inline HeapWord* ParMarkBitMap::find_obj_beg_reverse(HeapWord* beg, HeapWord* end) const {
117 const idx_t beg_bit = addr_to_bit(beg);
118 const idx_t end_bit = addr_to_bit(end);
119 const idx_t res_bit = _beg_bits.find_last_set_bit(beg_bit, end_bit);
120 return bit_to_addr(res_bit);
121 }
122
123 #ifdef ASSERT
124 inline void ParMarkBitMap::verify_bit(idx_t bit) const {
125 // Allow one past the last valid bit; useful for loop bounds.
126 assert(bit <= _beg_bits.size(), "bit out of range");
127 }
128
129 inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
130 // Allow one past the last valid address; useful for loop bounds.
131 assert(addr >= heap_start(),
132 "addr too small, addr: " PTR_FORMAT " heap start: " PTR_FORMAT, p2i(addr), p2i(heap_start()));
133 assert(addr <= heap_end(),
134 "addr too big, addr: " PTR_FORMAT " heap end: " PTR_FORMAT, p2i(addr), p2i(heap_end()));
135 }
136 #endif // #ifdef ASSERT
137
138 #endif // SHARE_GC_PARALLEL_PARMARKBITMAP_INLINE_HPP
|