Mercurial > hg > truffle
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 { |