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
|