comparison src/share/vm/memory/barrierSet.inline.hpp @ 1339:09ac706c2623

Merge
author asaha
date Wed, 24 Mar 2010 17:16:33 -0700
parents 6484c4ee11cb
children c18cbe5936b8
comparison
equal deleted inserted replaced
1338:f5dd08ad65df 1339:09ac706c2623
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) { 45 // count is number of array elements being written
46 if (kind() == CardTableModRef) { 46 void BarrierSet::write_ref_array(HeapWord* start, size_t count) {
47 ((CardTableModRefBS*)this)->inline_write_ref_array(mr); 47 assert(count <= (size_t)max_intx, "count too large");
48 } else { 48 HeapWord* end = (HeapWord*)((char*)start + (count*heapOopSize));
49 write_ref_array_work(mr); 49 // In the case of compressed oops, start and end may potentially be misaligned;
50 } 50 // so we need to conservatively align the first downward (this is not
51 // strictly necessary for current uses, but a case of good hygiene and,
52 // if you will, aesthetics) and the second upward (this is essential for
53 // current uses) to a HeapWord boundary, so we mark all cards overlapping
54 // this write. If this evolves in the future to calling a
55 // logging barrier of narrow oop granularity, like the pre-barrier for G1
56 // (mentioned here merely by way of example), we will need to change this
57 // interface, so it is "exactly precise" (if i may be allowed the adverbial
58 // redundancy for emphasis) and does not include narrow oop slots not
59 // included in the original write interval.
60 HeapWord* aligned_start = (HeapWord*)align_size_down((uintptr_t)start, HeapWordSize);
61 HeapWord* aligned_end = (HeapWord*)align_size_up ((uintptr_t)end, HeapWordSize);
62 // If compressed oops were not being used, these should already be aligned
63 assert(UseCompressedOops || (aligned_start == start && aligned_end == end),
64 "Expected heap word alignment of start and end");
65 #if 0
66 warning("Post:\t" INTPTR_FORMAT "[" SIZE_FORMAT "] : [" INTPTR_FORMAT","INTPTR_FORMAT")\t",
67 start, count, aligned_start, aligned_end);
68 #endif
69 write_ref_array_work(MemRegion(aligned_start, aligned_end));
51 } 70 }
71
52 72
53 void BarrierSet::write_region(MemRegion mr) { 73 void BarrierSet::write_region(MemRegion mr) {
54 if (kind() == CardTableModRef) { 74 if (kind() == CardTableModRef) {
55 ((CardTableModRefBS*)this)->inline_write_region(mr); 75 ((CardTableModRefBS*)this)->inline_write_region(mr);
56 } else { 76 } else {