171 size_t live_words_in_range_helper(HeapWord* beg_addr, oop end_obj) const;
172
173 bool is_live_words_in_range_in_cache(ParCompactionManager* cm, HeapWord* beg_addr) const;
174 size_t live_words_in_range_use_cache(ParCompactionManager* cm, HeapWord* beg_addr, oop end_obj) const;
175 void update_live_words_in_range_cache(ParCompactionManager* cm, HeapWord* beg_addr, oop end_obj, size_t result) const;
176
177 // Each bit in the bitmap represents one unit of 'object granularity.' Objects
178 // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
179 // granularity is 2, 64-bit is 1.
180 static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
181 static inline int obj_granularity_shift() { return LogMinObjAlignment; }
182
183 HeapWord* _region_start;
184 size_t _region_size;
185 BitMapView _beg_bits;
186 BitMapView _end_bits;
187 PSVirtualSpace* _virtual_space;
188 size_t _reserved_byte_size;
189 };
190
191 inline ParMarkBitMap::ParMarkBitMap():
192 _beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL), _reserved_byte_size(0)
193 { }
194
195 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
196 {
197 _beg_bits.clear_range(beg, end);
198 _end_bits.clear_range(beg, end);
199 }
200
201 inline ParMarkBitMap::idx_t
202 ParMarkBitMap::bits_required(size_t words)
203 {
204 // Need two bits (one begin bit, one end bit) for each unit of 'object
205 // granularity' in the heap.
206 return words_to_bits(words * 2);
207 }
208
209 inline ParMarkBitMap::idx_t
210 ParMarkBitMap::bits_required(MemRegion covered_region)
211 {
212 return bits_required(covered_region.word_size());
213 }
214
215 inline HeapWord*
216 ParMarkBitMap::region_start() const
217 {
218 return _region_start;
219 }
220
221 inline HeapWord*
222 ParMarkBitMap::region_end() const
223 {
224 return region_start() + region_size();
225 }
226
227 inline size_t
228 ParMarkBitMap::region_size() const
229 {
230 return _region_size;
231 }
232
233 inline size_t
234 ParMarkBitMap::size() const
235 {
236 return _beg_bits.size();
237 }
238
239 inline bool ParMarkBitMap::is_obj_beg(idx_t bit) const
240 {
241 return _beg_bits.at(bit);
242 }
243
244 inline bool ParMarkBitMap::is_obj_end(idx_t bit) const
245 {
246 return _end_bits.at(bit);
247 }
248
249 inline bool ParMarkBitMap::is_marked(idx_t bit) const
250 {
251 return is_obj_beg(bit);
252 }
253
254 inline bool ParMarkBitMap::is_marked(HeapWord* addr) const
255 {
256 return is_marked(addr_to_bit(addr));
257 }
258
259 inline bool ParMarkBitMap::is_marked(oop obj) const
260 {
261 return is_marked((HeapWord*)obj);
262 }
263
264 inline bool ParMarkBitMap::is_unmarked(idx_t bit) const
265 {
266 return !is_marked(bit);
267 }
268
269 inline bool ParMarkBitMap::is_unmarked(HeapWord* addr) const
270 {
271 return !is_marked(addr);
272 }
273
274 inline bool ParMarkBitMap::is_unmarked(oop obj) const
275 {
276 return !is_marked(obj);
277 }
278
279 inline size_t
280 ParMarkBitMap::bits_to_words(idx_t bits)
281 {
282 return bits << obj_granularity_shift();
283 }
284
285 inline ParMarkBitMap::idx_t
286 ParMarkBitMap::words_to_bits(size_t words)
287 {
288 return words >> obj_granularity_shift();
289 }
290
291 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
292 {
293 DEBUG_ONLY(verify_bit(beg_bit);)
294 DEBUG_ONLY(verify_bit(end_bit);)
295 return bits_to_words(end_bit - beg_bit + 1);
296 }
297
298 inline size_t
299 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
300 {
301 DEBUG_ONLY(verify_addr(beg_addr);)
302 DEBUG_ONLY(verify_addr(end_addr);)
303 return pointer_delta(end_addr, beg_addr) + obj_granularity();
304 }
305
306 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
307 {
308 const idx_t end_bit = _end_bits.get_next_one_offset(beg_bit, size());
309 assert(is_marked(beg_bit), "obj not marked");
310 assert(end_bit < size(), "end bit missing");
311 return obj_size(beg_bit, end_bit);
312 }
313
314 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
315 {
316 return obj_size(addr_to_bit(addr));
317 }
318
319 inline ParMarkBitMap::IterationStatus
320 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
321 HeapWord* range_beg,
322 HeapWord* range_end) const
323 {
324 return iterate(live_closure, addr_to_bit(range_beg), addr_to_bit(range_end));
325 }
326
327 inline ParMarkBitMap::IterationStatus
328 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
329 ParMarkBitMapClosure* dead_closure,
330 HeapWord* range_beg,
331 HeapWord* range_end,
332 HeapWord* dead_range_end) const
333 {
334 return iterate(live_closure, dead_closure,
335 addr_to_bit(range_beg), addr_to_bit(range_end),
336 addr_to_bit(dead_range_end));
337 }
338
339 inline bool
340 ParMarkBitMap::mark_obj(oop obj, int size)
341 {
342 return mark_obj((HeapWord*)obj, (size_t)size);
343 }
344
345 inline BitMap::idx_t
346 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
347 {
348 DEBUG_ONLY(verify_addr(addr);)
349 return words_to_bits(pointer_delta(addr, region_start()));
350 }
351
352 inline HeapWord*
353 ParMarkBitMap::bit_to_addr(idx_t bit) const
354 {
355 DEBUG_ONLY(verify_bit(bit);)
356 return region_start() + bits_to_words(bit);
357 }
358
359 inline ParMarkBitMap::idx_t
360 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
361 {
362 return _beg_bits.get_next_one_offset_aligned_right(beg, end);
363 }
364
365 inline ParMarkBitMap::idx_t
366 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
367 {
368 return _end_bits.get_next_one_offset_aligned_right(beg, end);
369 }
370
371 inline HeapWord*
372 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
373 {
374 const idx_t beg_bit = addr_to_bit(beg);
375 const idx_t end_bit = addr_to_bit(end);
376 const idx_t search_end = BitMap::word_align_up(end_bit);
377 const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
378 return bit_to_addr(res_bit);
379 }
380
381 inline HeapWord*
382 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
383 {
384 const idx_t beg_bit = addr_to_bit(beg);
385 const idx_t end_bit = addr_to_bit(end);
386 const idx_t search_end = BitMap::word_align_up(end_bit);
387 const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
388 return bit_to_addr(res_bit);
389 }
390
391 #ifdef ASSERT
392 inline void ParMarkBitMap::verify_bit(idx_t bit) const {
393 // Allow one past the last valid bit; useful for loop bounds.
394 assert(bit <= _beg_bits.size(), "bit out of range");
395 }
396
397 inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
398 // Allow one past the last valid address; useful for loop bounds.
399 assert(addr >= region_start(),
400 "addr too small, addr: " PTR_FORMAT " region start: " PTR_FORMAT, p2i(addr), p2i(region_start()));
401 assert(addr <= region_end(),
402 "addr too big, addr: " PTR_FORMAT " region end: " PTR_FORMAT, p2i(addr), p2i(region_end()));
403 }
404 #endif // #ifdef ASSERT
405
406 #endif // SHARE_VM_GC_PARALLEL_PARMARKBITMAP_HPP
|
171 size_t live_words_in_range_helper(HeapWord* beg_addr, oop end_obj) const;
172
173 bool is_live_words_in_range_in_cache(ParCompactionManager* cm, HeapWord* beg_addr) const;
174 size_t live_words_in_range_use_cache(ParCompactionManager* cm, HeapWord* beg_addr, oop end_obj) const;
175 void update_live_words_in_range_cache(ParCompactionManager* cm, HeapWord* beg_addr, oop end_obj, size_t result) const;
176
177 // Each bit in the bitmap represents one unit of 'object granularity.' Objects
178 // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
179 // granularity is 2, 64-bit is 1.
180 static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
181 static inline int obj_granularity_shift() { return LogMinObjAlignment; }
182
183 HeapWord* _region_start;
184 size_t _region_size;
185 BitMapView _beg_bits;
186 BitMapView _end_bits;
187 PSVirtualSpace* _virtual_space;
188 size_t _reserved_byte_size;
189 };
190
191 #endif // SHARE_VM_GC_PARALLEL_PARMARKBITMAP_HPP
|