src/share/vm/memory/barrierSet.inline.hpp

changeset 1526
6aa7255741f3
parent 1280
df6caf649ff7
child 1680
6484c4ee11cb
equal deleted inserted replaced
1525:fa357420e7d2 1526:6aa7255741f3
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) { 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" );
46 if (kind() == CardTableModRef) { 48 if (kind() == CardTableModRef) {
47 ((CardTableModRefBS*)this)->inline_write_ref_array(mr); 49 ((CardTableModRefBS*)this)->inline_write_ref_array(mr);
48 } else { 50 } else {
49 write_ref_array_work(mr); 51 write_ref_array_work(mr);
50 } 52 }
51 } 53 }
54
55 // count is number of array elements being written
56 void BarrierSet::write_ref_array(HeapWord* start, size_t count) {
57 assert(count <= (size_t)max_intx, "count too large");
58 HeapWord* end = (HeapWord*)((char*)start + (count*heapOopSize));
59 // 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
61 // 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
63 // 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
65 // 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
67 // interface, much like the pre-barrier one above, so it is "exactly precise"
68 // (if i may be allowed the adverbial redundancy for emphasis) and does not
69 // include narrow oop slots not included in the original write interval.
70 HeapWord* aligned_start = (HeapWord*)align_size_down((uintptr_t)start, HeapWordSize);
71 HeapWord* aligned_end = (HeapWord*)align_size_up ((uintptr_t)end, HeapWordSize);
72 // If compressed oops were not being used, these should already be aligned
73 assert(UseCompressedOops || (aligned_start == start && aligned_end == end),
74 "Expected heap word alignment of start and end");
75 #if 0
76 warning("Post:\t" INTPTR_FORMAT "[" SIZE_FORMAT "] : [" INTPTR_FORMAT","INTPTR_FORMAT")\t",
77 start, count, aligned_start, aligned_end);
78 #endif
79 write_ref_array_work(MemRegion(aligned_start, aligned_end));
80 }
81
52 82
53 void BarrierSet::write_region(MemRegion mr) { 83 void BarrierSet::write_region(MemRegion mr) {
54 if (kind() == CardTableModRef) { 84 if (kind() == CardTableModRef) {
55 ((CardTableModRefBS*)this)->inline_write_region(mr); 85 ((CardTableModRefBS*)this)->inline_write_region(mr);
56 } else { 86 } else {

mercurial