40 } else { |
40 } else { |
41 write_ref_field_work(field, new_val); |
41 write_ref_field_work(field, new_val); |
42 } |
42 } |
43 } |
43 } |
44 |
44 |
45 void BarrierSet::write_ref_array(MemRegion mr) { |
|
46 assert((HeapWord*)align_size_down((uintptr_t)mr.start(), HeapWordSize) == mr.start() , "Unaligned start"); |
|
47 assert((HeapWord*)align_size_up ((uintptr_t)mr.end(), HeapWordSize) == mr.end(), "Unaligned end" ); |
|
48 if (kind() == CardTableModRef) { |
|
49 ((CardTableModRefBS*)this)->inline_write_ref_array(mr); |
|
50 } else { |
|
51 write_ref_array_work(mr); |
|
52 } |
|
53 } |
|
54 |
|
55 // count is number of array elements being written |
45 // count is number of array elements being written |
56 void BarrierSet::write_ref_array(HeapWord* start, size_t count) { |
46 void BarrierSet::write_ref_array(HeapWord* start, size_t count) { |
57 assert(count <= (size_t)max_intx, "count too large"); |
47 assert(count <= (size_t)max_intx, "count too large"); |
58 HeapWord* end = (HeapWord*)((char*)start + (count*heapOopSize)); |
48 HeapWord* end = (HeapWord*)((char*)start + (count*heapOopSize)); |
59 // In the case of compressed oops, start and end may potentially be misaligned; |
49 // In the case of compressed oops, start and end may potentially be misaligned; |
60 // so we need to conservatively align the first downward (this is not |
50 // so we need to conservatively align the first downward (this is not |
61 // strictly necessary for current uses, but a case of good hygiene and, |
51 // strictly necessary for current uses, but a case of good hygiene and, |
62 // if you will, aesthetics) and the second upward (this is essential for |
52 // if you will, aesthetics) and the second upward (this is essential for |
63 // current uses) to a HeapWord boundary, so we mark all cards overlapping |
53 // current uses) to a HeapWord boundary, so we mark all cards overlapping |
64 // this write. In the event that this evolves in the future to calling a |
54 // this write. If this evolves in the future to calling a |
65 // logging barrier of narrow oop granularity, like the pre-barrier for G1 |
55 // logging barrier of narrow oop granularity, like the pre-barrier for G1 |
66 // (mentioned here merely by way of example), we will need to change this |
56 // (mentioned here merely by way of example), we will need to change this |
67 // interface, much like the pre-barrier one above, so it is "exactly precise" |
57 // interface, so it is "exactly precise" (if i may be allowed the adverbial |
68 // (if i may be allowed the adverbial redundancy for emphasis) and does not |
58 // redundancy for emphasis) and does not include narrow oop slots not |
69 // include narrow oop slots not included in the original write interval. |
59 // included in the original write interval. |
70 HeapWord* aligned_start = (HeapWord*)align_size_down((uintptr_t)start, HeapWordSize); |
60 HeapWord* aligned_start = (HeapWord*)align_size_down((uintptr_t)start, HeapWordSize); |
71 HeapWord* aligned_end = (HeapWord*)align_size_up ((uintptr_t)end, HeapWordSize); |
61 HeapWord* aligned_end = (HeapWord*)align_size_up ((uintptr_t)end, HeapWordSize); |
72 // If compressed oops were not being used, these should already be aligned |
62 // If compressed oops were not being used, these should already be aligned |
73 assert(UseCompressedOops || (aligned_start == start && aligned_end == end), |
63 assert(UseCompressedOops || (aligned_start == start && aligned_end == end), |
74 "Expected heap word alignment of start and end"); |
64 "Expected heap word alignment of start and end"); |