equal
deleted
inserted
replaced
22 * |
22 * |
23 */ |
23 */ |
24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp" |
26 #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp" |
27 #include "gc_implementation/parallelScavenge/parMarkBitMap.inline.hpp" |
|
28 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" |
27 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" |
29 #include "oops/oop.inline.hpp" |
28 #include "oops/oop.inline.hpp" |
30 #include "runtime/os.hpp" |
29 #include "runtime/os.hpp" |
31 #include "utilities/bitMap.inline.hpp" |
30 #include "utilities/bitMap.inline.hpp" |
32 #include "services/memTracker.hpp" |
31 #include "services/memTracker.hpp" |
106 return true; |
105 return true; |
107 } |
106 } |
108 return false; |
107 return false; |
109 } |
108 } |
110 |
109 |
111 size_t |
|
112 ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, HeapWord* end_addr) const |
|
113 { |
|
114 assert(beg_addr <= end_addr, "bad range"); |
|
115 |
|
116 idx_t live_bits = 0; |
|
117 |
|
118 // The bitmap routines require the right boundary to be word-aligned. |
|
119 const idx_t end_bit = addr_to_bit(end_addr); |
|
120 const idx_t range_end = BitMap::word_align_up(end_bit); |
|
121 |
|
122 idx_t beg_bit = find_obj_beg(addr_to_bit(beg_addr), range_end); |
|
123 while (beg_bit < end_bit) { |
|
124 idx_t tmp_end = find_obj_end(beg_bit, range_end); |
|
125 if (tmp_end < end_bit) { |
|
126 live_bits += tmp_end - beg_bit + 1; |
|
127 beg_bit = find_obj_beg(tmp_end + 1, range_end); |
|
128 } else { |
|
129 live_bits += end_bit - beg_bit; // No + 1 here; end_bit is not counted. |
|
130 return bits_to_words(live_bits); |
|
131 } |
|
132 } |
|
133 return bits_to_words(live_bits); |
|
134 } |
|
135 |
|
136 size_t ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, oop end_obj) const |
110 size_t ParMarkBitMap::live_words_in_range(HeapWord* beg_addr, oop end_obj) const |
137 { |
111 { |
138 assert(beg_addr <= (HeapWord*)end_obj, "bad range"); |
112 assert(beg_addr <= (HeapWord*)end_obj, "bad range"); |
139 assert(is_marked(end_obj), "end_obj must be live"); |
113 assert(is_marked(end_obj), "end_obj must be live"); |
140 |
114 |
242 |
216 |
243 live_closure->set_source(bit_to_addr(range_end)); |
217 live_closure->set_source(bit_to_addr(range_end)); |
244 return complete; |
218 return complete; |
245 } |
219 } |
246 |
220 |
247 #ifndef PRODUCT |
|
248 void ParMarkBitMap::reset_counters() |
|
249 { |
|
250 _cas_tries = _cas_retries = _cas_by_another = 0; |
|
251 } |
|
252 #endif // #ifndef PRODUCT |
|
253 |
|
254 #ifdef ASSERT |
221 #ifdef ASSERT |
255 void ParMarkBitMap::verify_clear() const |
222 void ParMarkBitMap::verify_clear() const |
256 { |
223 { |
257 const idx_t* const beg = (const idx_t*)_virtual_space->committed_low_addr(); |
224 const idx_t* const beg = (const idx_t*)_virtual_space->committed_low_addr(); |
258 const idx_t* const end = (const idx_t*)_virtual_space->committed_high_addr(); |
225 const idx_t* const end = (const idx_t*)_virtual_space->committed_high_addr(); |