1 /*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
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 *
90 return result;
91 }
92
93 inline HeapWord* G1BlockOffsetTable::address_for_index(size_t index) const {
94 check_index(index, "index out of range");
95 HeapWord* result = address_for_index_raw(index);
96 assert(result >= _reserved.start() && result < _reserved.end(),
97 "bad address from index result " PTR_FORMAT
98 " _reserved.start() " PTR_FORMAT " _reserved.end() " PTR_FORMAT,
99 p2i(result), p2i(_reserved.start()), p2i(_reserved.end()));
100 return result;
101 }
102
103 inline size_t G1BlockOffsetTablePart::block_size(const HeapWord* p) const {
104 return _space->block_size(p);
105 }
106
107 inline HeapWord* G1BlockOffsetTablePart::block_at_or_preceding(const void* addr,
108 bool has_max_index,
109 size_t max_index) const {
110 assert(_bot->offset_array(0) == 0, "objects can't cross covered areas");
111 size_t index = _bot->index_for(addr);
112 // We must make sure that the offset table entry we use is valid. If
113 // "addr" is past the end, start at the last known one and go forward.
114 if (has_max_index) {
115 index = MIN2(index, max_index);
116 }
117 HeapWord* q = _bot->address_for_index(index);
118
119 uint offset = _bot->offset_array(index); // Extend u_char to uint.
120 while (offset >= BOTConstants::N_words) {
121 // The excess of the offset from N_words indicates a power of Base
122 // to go back by.
123 size_t n_cards_back = BOTConstants::entry_to_cards_back(offset);
124 q -= (BOTConstants::N_words * n_cards_back);
125 index -= n_cards_back;
126 offset = _bot->offset_array(index);
127 }
128 assert(offset < BOTConstants::N_words, "offset too large");
129 q -= offset;
130 return q;
|
1 /*
2 * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
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 *
90 return result;
91 }
92
93 inline HeapWord* G1BlockOffsetTable::address_for_index(size_t index) const {
94 check_index(index, "index out of range");
95 HeapWord* result = address_for_index_raw(index);
96 assert(result >= _reserved.start() && result < _reserved.end(),
97 "bad address from index result " PTR_FORMAT
98 " _reserved.start() " PTR_FORMAT " _reserved.end() " PTR_FORMAT,
99 p2i(result), p2i(_reserved.start()), p2i(_reserved.end()));
100 return result;
101 }
102
103 inline size_t G1BlockOffsetTablePart::block_size(const HeapWord* p) const {
104 return _space->block_size(p);
105 }
106
107 inline HeapWord* G1BlockOffsetTablePart::block_at_or_preceding(const void* addr,
108 bool has_max_index,
109 size_t max_index) const {
110 assert(_object_can_span || _bot->offset_array(_bot->index_for(_space->bottom())) == 0,
111 "Object crossed region boundary, found offset %u instead of 0",
112 (uint) _bot->offset_array(_bot->index_for(_space->bottom())));
113 size_t index = _bot->index_for(addr);
114 // We must make sure that the offset table entry we use is valid. If
115 // "addr" is past the end, start at the last known one and go forward.
116 if (has_max_index) {
117 index = MIN2(index, max_index);
118 }
119 HeapWord* q = _bot->address_for_index(index);
120
121 uint offset = _bot->offset_array(index); // Extend u_char to uint.
122 while (offset >= BOTConstants::N_words) {
123 // The excess of the offset from N_words indicates a power of Base
124 // to go back by.
125 size_t n_cards_back = BOTConstants::entry_to_cards_back(offset);
126 q -= (BOTConstants::N_words * n_cards_back);
127 index -= n_cards_back;
128 offset = _bot->offset_array(index);
129 }
130 assert(offset < BOTConstants::N_words, "offset too large");
131 q -= offset;
132 return q;
|