< prev index next >

src/share/vm/gc/parallel/parMarkBitMap.hpp

Print this page
rev 13014 : imported patch 8180755-remove-bitmap-inline-hpp-include


 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
< prev index next >