hotspot/src/share/vm/gc/g1/g1Allocator.inline.hpp
changeset 46810 7dad333205cd
parent 46285 5b673a9fa682
equal deleted inserted replaced
46809:057f21a10f5f 46810:7dad333205cd
    53   } else {
    53   } else {
    54     return buffer->allocate_aligned(word_sz, _survivor_alignment_bytes);
    54     return buffer->allocate_aligned(word_sz, _survivor_alignment_bytes);
    55   }
    55   }
    56 }
    56 }
    57 
    57 
    58 // Create the _archive_region_map which is used to identify archive objects.
    58 // Create the maps which is used to identify archive objects.
    59 inline void G1ArchiveAllocator::enable_archive_object_check() {
    59 inline void G1ArchiveAllocator::enable_archive_object_check() {
    60   assert(!_archive_check_enabled, "archive range check already enabled");
    60   if (_archive_check_enabled) {
       
    61     return;
       
    62   }
       
    63 
    61   _archive_check_enabled = true;
    64   _archive_check_enabled = true;
    62   size_t length = Universe::heap()->max_capacity();
    65   size_t length = Universe::heap()->max_capacity();
    63   _archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
    66   _closed_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
    64                                  (HeapWord*)Universe::heap()->base() + length,
    67                                         (HeapWord*)Universe::heap()->base() + length,
    65                                  HeapRegion::GrainBytes);
    68                                         HeapRegion::GrainBytes);
       
    69   _open_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
       
    70                                       (HeapWord*)Universe::heap()->base() + length,
       
    71                                       HeapRegion::GrainBytes);
    66 }
    72 }
    67 
    73 
    68 // Set the regions containing the specified address range as archive/non-archive.
    74 // Set the regions containing the specified address range as archive.
    69 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool is_archive) {
    75 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
    70   assert(_archive_check_enabled, "archive range check not enabled");
    76   assert(_archive_check_enabled, "archive range check not enabled");
    71   _archive_region_map.set_by_address(range, is_archive);
    77   if (open) {
       
    78     _open_archive_region_map.set_by_address(range, true);
       
    79   } else {
       
    80     _closed_archive_region_map.set_by_address(range, true);
       
    81   }
    72 }
    82 }
    73 
    83 
    74 // Check if an object is in an archive region using the _archive_region_map.
    84 // Check if an object is in a closed archive region using the _archive_region_map.
    75 inline bool G1ArchiveAllocator::in_archive_range(oop object) {
    85 inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
    76   // This is the out-of-line part of is_archive_object test, done separately
    86   // This is the out-of-line part of is_closed_archive_object test, done separately
    77   // to avoid additional performance impact when the check is not enabled.
    87   // to avoid additional performance impact when the check is not enabled.
    78   return _archive_region_map.get_by_address((HeapWord*)object);
    88   return _closed_archive_region_map.get_by_address((HeapWord*)object);
    79 }
    89 }
    80 
    90 
    81 // Check if archive object checking is enabled, to avoid calling in_archive_range
    91 inline bool G1ArchiveAllocator::in_open_archive_range(oop object) {
       
    92   return _open_archive_region_map.get_by_address((HeapWord*)object);
       
    93 }
       
    94 
       
    95 // Check if archive object checking is enabled, to avoid calling in_open/closed_archive_range
    82 // unnecessarily.
    96 // unnecessarily.
    83 inline bool G1ArchiveAllocator::archive_check_enabled() {
    97 inline bool G1ArchiveAllocator::archive_check_enabled() {
    84   return _archive_check_enabled;
    98   return _archive_check_enabled;
    85 }
    99 }
    86 
   100 
       
   101 inline bool G1ArchiveAllocator::is_closed_archive_object(oop object) {
       
   102   return (archive_check_enabled() && in_closed_archive_range(object));
       
   103 }
       
   104 
       
   105 inline bool G1ArchiveAllocator::is_open_archive_object(oop object) {
       
   106   return (archive_check_enabled() && in_open_archive_range(object));
       
   107 }
       
   108 
    87 inline bool G1ArchiveAllocator::is_archive_object(oop object) {
   109 inline bool G1ArchiveAllocator::is_archive_object(oop object) {
    88   return (archive_check_enabled() && in_archive_range(object));
   110   return (archive_check_enabled() && (in_closed_archive_range(object) ||
       
   111                                       in_open_archive_range(object)));
    89 }
   112 }
    90 
   113 
    91 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP
   114 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP