< prev index next >

src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp

Print this page
rev 8237 : 8079330: Circular dependency between G1CollectedHeap and G1BlockOffsetSharedArray
Reviewed-by:


   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc_implementation/g1/g1CollectedHeap.hpp"
  27 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"

  28 #include "gc_implementation/g1/heapRegion.hpp"
  29 #include "memory/space.hpp"
  30 #include "oops/oop.inline.hpp"
  31 #include "runtime/java.hpp"
  32 #include "services/memTracker.hpp"
  33 
  34 
  35 
  36 //////////////////////////////////////////////////////////////////////
  37 // G1BlockOffsetSharedArray
  38 //////////////////////////////////////////////////////////////////////
  39 
  40 G1BlockOffsetSharedArray::G1BlockOffsetSharedArray(MemRegion heap, G1RegionToSpaceMapper* storage) :
  41   _reserved(), _end(NULL), _listener(), _offset_array(NULL) {
  42 
  43   _reserved = heap;
  44   _end = NULL;
  45 
  46   MemRegion bot_reserved = storage->reserved();
  47 
  48   _offset_array = (u_char*)bot_reserved.start();
  49   _end = _reserved.end();
  50 
  51   storage->set_mapping_changed_listener(&_listener);
  52 
  53   if (TraceBlockOffsetTable) {
  54     gclog_or_tty->print_cr("G1BlockOffsetSharedArray::G1BlockOffsetSharedArray: ");
  55     gclog_or_tty->print_cr("  "
  56                   "  rs.base(): " PTR_FORMAT
  57                   "  rs.size(): " SIZE_FORMAT
  58                   "  rs end(): " PTR_FORMAT,
  59                   p2i(bot_reserved.start()), bot_reserved.byte_size(), p2i(bot_reserved.end()));
  60   }
  61 }
  62 
  63 bool G1BlockOffsetSharedArray::is_card_boundary(HeapWord* p) const {
  64   assert(p >= _reserved.start(), "just checking");
  65   size_t delta = pointer_delta(p, _reserved.start());
  66   return (delta & right_n_bits(LogN_words)) == (size_t)NoBits;
  67 }














  68 
  69 //////////////////////////////////////////////////////////////////////
  70 // G1BlockOffsetArray
  71 //////////////////////////////////////////////////////////////////////
  72 
  73 G1BlockOffsetArray::G1BlockOffsetArray(G1BlockOffsetSharedArray* array,
  74                                        MemRegion mr) :
  75   G1BlockOffsetTable(mr.start(), mr.end()),
  76   _unallocated_block(_bottom),
  77   _array(array), _gsp(NULL) {
  78   assert(_bottom <= _end, "arguments out of order");
  79 }
  80 
  81 void G1BlockOffsetArray::set_space(G1OffsetTableContigSpace* sp) {
  82   _gsp = sp;
  83 }
  84 
  85 // The arguments follow the normal convention of denoting
  86 // a right-open interval: [start, end)
  87 void




   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"

  26 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
  27 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
  28 #include "gc_implementation/g1/heapRegion.hpp"
  29 #include "memory/space.hpp"
  30 #include "oops/oop.inline.hpp"
  31 #include "runtime/java.hpp"
  32 #include "services/memTracker.hpp"
  33 
  34 
  35 
  36 //////////////////////////////////////////////////////////////////////
  37 // G1BlockOffsetSharedArray
  38 //////////////////////////////////////////////////////////////////////
  39 
  40 G1BlockOffsetSharedArray::G1BlockOffsetSharedArray(MemRegion heap, G1RegionToSpaceMapper* storage) :
  41   _reserved(), _end(NULL), _listener(), _offset_array(NULL) {
  42 
  43   _reserved = heap;
  44   _end = NULL;
  45 
  46   MemRegion bot_reserved = storage->reserved();
  47 
  48   _offset_array = (u_char*)bot_reserved.start();
  49   _end = _reserved.end();
  50 
  51   storage->set_mapping_changed_listener(&_listener);
  52 
  53   if (TraceBlockOffsetTable) {
  54     gclog_or_tty->print_cr("G1BlockOffsetSharedArray::G1BlockOffsetSharedArray: ");
  55     gclog_or_tty->print_cr("  "
  56                   "  rs.base(): " PTR_FORMAT
  57                   "  rs.size(): " SIZE_FORMAT
  58                   "  rs end(): " PTR_FORMAT,
  59                   p2i(bot_reserved.start()), bot_reserved.byte_size(), p2i(bot_reserved.end()));
  60   }
  61 }
  62 
  63 bool G1BlockOffsetSharedArray::is_card_boundary(HeapWord* p) const {
  64   assert(p >= _reserved.start(), "just checking");
  65   size_t delta = pointer_delta(p, _reserved.start());
  66   return (delta & right_n_bits(LogN_words)) == (size_t)NoBits;
  67 }
  68 
  69 #ifdef ASSERT
  70 void G1BlockOffsetSharedArray::check_index(size_t index, const char* msg) const {
  71   assert((index) < (_reserved.word_size() >> LogN_words),
  72          err_msg("%s - index: "SIZE_FORMAT", _vs.committed_size: "SIZE_FORMAT,
  73                  msg, (index), (_reserved.word_size() >> LogN_words)));
  74   assert(G1CollectedHeap::heap()->is_in_exact(address_for_index_raw(index)),
  75          err_msg("Index "SIZE_FORMAT" corresponding to "PTR_FORMAT
  76                  " (%u) is not in committed area.",
  77                  (index),
  78                  p2i(address_for_index_raw(index)),
  79                  G1CollectedHeap::heap()->addr_to_region(address_for_index_raw(index))));
  80 }
  81 #endif // ASSERT
  82 
  83 //////////////////////////////////////////////////////////////////////
  84 // G1BlockOffsetArray
  85 //////////////////////////////////////////////////////////////////////
  86 
  87 G1BlockOffsetArray::G1BlockOffsetArray(G1BlockOffsetSharedArray* array,
  88                                        MemRegion mr) :
  89   G1BlockOffsetTable(mr.start(), mr.end()),
  90   _unallocated_block(_bottom),
  91   _array(array), _gsp(NULL) {
  92   assert(_bottom <= _end, "arguments out of order");
  93 }
  94 
  95 void G1BlockOffsetArray::set_space(G1OffsetTableContigSpace* sp) {
  96   _gsp = sp;
  97 }
  98 
  99 // The arguments follow the normal convention of denoting
 100 // a right-open interval: [start, end)
 101 void


< prev index next >