512 link_to_all(prt); |
512 link_to_all(prt); |
513 } |
513 } |
514 |
514 |
515 PerRegionTable* first_prt = _fine_grain_regions[ind]; |
515 PerRegionTable* first_prt = _fine_grain_regions[ind]; |
516 prt->set_collision_list_next(first_prt); |
516 prt->set_collision_list_next(first_prt); |
517 _fine_grain_regions[ind] = prt; |
517 // The assignment into _fine_grain_regions allows the prt to |
|
518 // start being used concurrently. In addition to |
|
519 // collision_list_next which must be visible (else concurrent |
|
520 // parsing of the list, if any, may fail to see other entries), |
|
521 // the content of the prt must be visible (else for instance |
|
522 // some mark bits may not yet seem cleared or a 'later' update |
|
523 // performed by a concurrent thread could be undone when the |
|
524 // zeroing becomes visible). This requires store ordering. |
|
525 OrderAccess::release_store_ptr((volatile PerRegionTable*)&_fine_grain_regions[ind], prt); |
518 _n_fine_entries++; |
526 _n_fine_entries++; |
519 |
527 |
520 if (G1HRRSUseSparseTable) { |
528 if (G1HRRSUseSparseTable) { |
521 // Transfer from sparse to fine-grain. |
529 // Transfer from sparse to fine-grain. |
522 SparsePRTEntry *sprt_entry = _sparse_table.get_entry(from_hrm_ind); |
530 SparsePRTEntry *sprt_entry = _sparse_table.get_entry(from_hrm_ind); |