@@ -257,23 +257,41 @@ inline size_t G1CardSetBitMap::header_size_in_bytes() {
257
257
return offset_of (G1CardSetBitMap, _bits);
258
258
}
259
259
260
+ inline G1CardSetHowl::ContainerPtr const * G1CardSetHowl::container_addr (EntryCountType index) const {
261
+ assert (index < _num_entries, " precondition" );
262
+ return buckets () + index ;
263
+ }
264
+
265
+ inline G1CardSetHowl::ContainerPtr* G1CardSetHowl::container_addr (EntryCountType index) {
266
+ return const_cast <ContainerPtr*>(const_cast <const G1CardSetHowl*>(this )->container_addr (index ));
267
+ }
268
+
269
+ inline G1CardSetHowl::ContainerPtr G1CardSetHowl::at (EntryCountType index) const {
270
+ return *container_addr (index );
271
+ }
272
+
273
+ inline G1CardSetHowl::ContainerPtr const * G1CardSetHowl::buckets () const {
274
+ const void * ptr = reinterpret_cast <const char *>(this ) + header_size_in_bytes ();
275
+ return reinterpret_cast <ContainerPtr const *>(ptr);
276
+ }
277
+
260
278
inline G1CardSetHowl::G1CardSetHowl (EntryCountType card_in_region, G1CardSetConfiguration* config) :
261
279
G1CardSetContainer(),
262
280
_num_entries((config->max_cards_in_array () + 1)) /* Card Transfer will not increment _num_entries */ {
263
281
EntryCountType num_buckets = config->num_buckets_in_howl ();
264
282
EntryCountType bucket = config->howl_bucket_index (card_in_region);
265
283
for (uint i = 0 ; i < num_buckets; ++i) {
266
- _buckets[i] = G1CardSetInlinePtr ();
284
+ * container_addr (i) = G1CardSetInlinePtr ();
267
285
if (i == bucket) {
268
- G1CardSetInlinePtr value (&_buckets[i], _buckets[i] );
286
+ G1CardSetInlinePtr value (container_addr (i), at (i) );
269
287
value.add (card_in_region, config->inline_ptr_bits_per_card (), config->max_cards_in_inline_ptr ());
270
288
}
271
289
}
272
290
}
273
291
274
292
inline bool G1CardSetHowl::contains (uint card_idx, G1CardSetConfiguration* config) {
275
293
EntryCountType bucket = config->howl_bucket_index (card_idx);
276
- ContainerPtr* array_entry = get_container_addr (bucket);
294
+ ContainerPtr* array_entry = container_addr (bucket);
277
295
ContainerPtr container = Atomic::load_acquire (array_entry);
278
296
279
297
switch (G1CardSet::container_type (container)) {
@@ -299,14 +317,14 @@ inline bool G1CardSetHowl::contains(uint card_idx, G1CardSetConfiguration* confi
299
317
template <class CardOrRangeVisitor >
300
318
inline void G1CardSetHowl::iterate (CardOrRangeVisitor& found, G1CardSetConfiguration* config) {
301
319
for (uint i = 0 ; i < config->num_buckets_in_howl (); ++i) {
302
- iterate_cardset (_buckets[i] , i, found, config);
320
+ iterate_cardset (at (i) , i, found, config);
303
321
}
304
322
}
305
323
306
324
template <class ContainerPtrVisitor >
307
325
inline void G1CardSetHowl::iterate (ContainerPtrVisitor& found, uint num_card_sets) {
308
326
for (uint i = 0 ; i < num_card_sets; ++i) {
309
- found (&_buckets[i] );
327
+ found (container_addr (i) );
310
328
}
311
329
}
312
330
0 commit comments