src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp

changeset 9046
4edb0f406a2c
parent 8316
626f594dffa6
child 9122
024be04bb151
child 9327
f96fcd9e1e1b
equal deleted inserted replaced
8909:e0c000e8eb75 9046:4edb0f406a2c
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);

mercurial