Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp @ 616:4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
6720334: G1: don't update RSets of collection set regions during an evacuation pause
Summary: Introduced a deferred update mechanism for delaying the rset updates during the collection pause
Reviewed-by: apetrusenko, tonyp
author | iveresov |
---|---|
date | Fri, 06 Mar 2009 13:50:14 -0800 |
parents | 37f87013dfd8 |
children | 87fa6e083d82 |
comparison
equal
deleted
inserted
replaced
615:c6c601a0f2d6 | 616:4f360ec815ba |
---|---|
29 return 1; | 29 return 1; |
30 } | 30 } |
31 } | 31 } |
32 | 32 |
33 inline void HRInto_G1RemSet::write_ref_nv(HeapRegion* from, oop* p) { | 33 inline void HRInto_G1RemSet::write_ref_nv(HeapRegion* from, oop* p) { |
34 oop obj = *p; | 34 par_write_ref(from, p, 0); |
35 assert(from != NULL && from->is_in_reserved(p), | |
36 "p is not in a from"); | |
37 HeapRegion* to = _g1->heap_region_containing(obj); | |
38 if (from != to && to != NULL) { | |
39 if (!to->popular() && !from->is_survivor()) { | |
40 #if G1_REM_SET_LOGGING | |
41 gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" | |
42 " for region [" PTR_FORMAT ", " PTR_FORMAT ")", | |
43 p, obj, | |
44 to->bottom(), to->end()); | |
45 #endif | |
46 assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); | |
47 if (to->rem_set()->add_reference(p)) { | |
48 _g1->schedule_popular_region_evac(to); | |
49 } | |
50 } | |
51 } | |
52 } | 35 } |
53 | 36 |
54 inline void HRInto_G1RemSet::write_ref(HeapRegion* from, oop* p) { | 37 inline void HRInto_G1RemSet::write_ref(HeapRegion* from, oop* p) { |
55 write_ref_nv(from, p); | 38 write_ref_nv(from, p); |
56 } | 39 } |
80 assert(from == NULL || from->is_in_reserved(p), | 63 assert(from == NULL || from->is_in_reserved(p), |
81 "p is not in from"); | 64 "p is not in from"); |
82 HeapRegion* to = _g1->heap_region_containing(obj); | 65 HeapRegion* to = _g1->heap_region_containing(obj); |
83 // The test below could be optimized by applying a bit op to to and from. | 66 // The test below could be optimized by applying a bit op to to and from. |
84 if (to != NULL && from != NULL && from != to) { | 67 if (to != NULL && from != NULL && from != to) { |
85 if (!to->popular() && !from->is_survivor()) { | 68 bool update_delayed = false; |
69 // There is a tricky infinite loop if we keep pushing | |
70 // self forwarding pointers onto our _new_refs list. | |
71 // The _par_traversal_in_progress flag is true during the collection pause, | |
72 // false during the evacuation failure handing. | |
73 if (_par_traversal_in_progress && | |
74 to->in_collection_set() && !self_forwarded(obj)) { | |
75 _new_refs[tid]->push(p); | |
76 // Deferred updates to the Cset are either discarded (in the normal case), | |
77 // or processed (if an evacuation failure occurs) at the end | |
78 // of the collection. | |
79 // See HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do(). | |
80 update_delayed = true; | |
81 } | |
82 | |
83 if (!to->popular() && !update_delayed) { | |
86 #if G1_REM_SET_LOGGING | 84 #if G1_REM_SET_LOGGING |
87 gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" | 85 gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" |
88 " for region [" PTR_FORMAT ", " PTR_FORMAT ")", | 86 " for region [" PTR_FORMAT ", " PTR_FORMAT ")", |
89 p, obj, | 87 p, obj, |
90 to->bottom(), to->end()); | 88 to->bottom(), to->end()); |
92 assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); | 90 assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); |
93 if (to->rem_set()->add_reference(p, tid)) { | 91 if (to->rem_set()->add_reference(p, tid)) { |
94 _g1->schedule_popular_region_evac(to); | 92 _g1->schedule_popular_region_evac(to); |
95 } | 93 } |
96 } | 94 } |
97 // There is a tricky infinite loop if we keep pushing | |
98 // self forwarding pointers onto our _new_refs list. | |
99 if (_par_traversal_in_progress && | |
100 to->in_collection_set() && !self_forwarded(obj)) { | |
101 _new_refs[tid]->push(p); | |
102 } | |
103 } | 95 } |
104 } | 96 } |