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/g1/g1BlockOffsetTable.inline.hpp" 27 #include "gc/g1/g1CollectedHeap.inline.hpp" 28 #include "gc/g1/heapRegion.hpp" 29 #include "gc/shared/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 "%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 "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 } | 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/g1/g1BlockOffsetTable.inline.hpp" 27 #include "gc/g1/g1CollectedHeap.inline.hpp" 28 #include "gc/g1/heapRegion.hpp" 29 #include "gc/shared/space.hpp" 30 #include "logging/log.hpp" 31 #include "oops/oop.inline.hpp" 32 #include "runtime/java.hpp" 33 #include "services/memTracker.hpp" 34 35 36 37 ////////////////////////////////////////////////////////////////////// 38 // G1BlockOffsetSharedArray 39 ////////////////////////////////////////////////////////////////////// 40 41 G1BlockOffsetSharedArray::G1BlockOffsetSharedArray(MemRegion heap, G1RegionToSpaceMapper* storage) : 42 _reserved(), _end(NULL), _listener(), _offset_array(NULL) { 43 44 _reserved = heap; 45 _end = NULL; 46 47 MemRegion bot_reserved = storage->reserved(); 48 49 _offset_array = (u_char*)bot_reserved.start(); 50 _end = _reserved.end(); 51 52 storage->set_mapping_changed_listener(&_listener); 53 54 log_trace(gc, bot)("G1BlockOffsetSharedArray::G1BlockOffsetSharedArray: "); 55 log_trace(gc, bot)(" rs.base(): " PTR_FORMAT " rs.size(): " SIZE_FORMAT " rs end(): " PTR_FORMAT, 56 p2i(bot_reserved.start()), bot_reserved.byte_size(), p2i(bot_reserved.end())); 57 } 58 59 bool G1BlockOffsetSharedArray::is_card_boundary(HeapWord* p) const { 60 assert(p >= _reserved.start(), "just checking"); 61 size_t delta = pointer_delta(p, _reserved.start()); 62 return (delta & right_n_bits(LogN_words)) == (size_t)NoBits; 63 } 64 65 #ifdef ASSERT 66 void G1BlockOffsetSharedArray::check_index(size_t index, const char* msg) const { 67 assert((index) < (_reserved.word_size() >> LogN_words), 68 "%s - index: " SIZE_FORMAT ", _vs.committed_size: " SIZE_FORMAT, 69 msg, (index), (_reserved.word_size() >> LogN_words)); 70 assert(G1CollectedHeap::heap()->is_in_exact(address_for_index_raw(index)), 71 "Index " SIZE_FORMAT " corresponding to " PTR_FORMAT 72 " (%u) is not in committed area.", 73 (index), 74 p2i(address_for_index_raw(index)), 75 G1CollectedHeap::heap()->addr_to_region(address_for_index_raw(index))); 76 } |