Tue, 26 Jan 2010 16:52:29 -0800
6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
Summary: G1 now answers "no" to the query can_elide_initializing_store_barrier() in the product build. A debug flag allows alternate behaviour in debug builds.
Reviewed-by: iveresov, tonyp
1 /*
2 * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
25 /*
26 * This really ought to be an inline function, but apparently the C++
27 * compiler sometimes sees fit to ignore inline declarations. Sigh.
28 */
30 // This must a ifdef'ed because the counting it controls is in a
31 // perf-critical inner loop.
32 #define FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT 0
34 template <class T> inline void FilterIntoCSClosure::do_oop_nv(T* p) {
35 T heap_oop = oopDesc::load_heap_oop(p);
36 if (!oopDesc::is_null(heap_oop) &&
37 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
38 _oc->do_oop(p);
39 #if FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT
40 _dcto_cl->incr_count();
41 #endif
42 }
43 }
45 #define FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT 0
47 template <class T> inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
48 T heap_oop = oopDesc::load_heap_oop(p);
49 if (!oopDesc::is_null(heap_oop)) {
50 HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
51 if (obj_hw < _r_bottom || obj_hw >= _r_end) {
52 _oc->do_oop(p);
53 #if FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT
54 _out_of_region++;
55 #endif
56 }
57 }
58 }
60 template <class T> inline void FilterInHeapRegionAndIntoCSClosure::do_oop_nv(T* p) {
61 T heap_oop = oopDesc::load_heap_oop(p);
62 if (!oopDesc::is_null(heap_oop) &&
63 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop)))
64 _oc->do_oop(p);
65 }
67 template <class T> inline void FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop_nv(T* p) {
68 T heap_oop = oopDesc::load_heap_oop(p);
69 if (!oopDesc::is_null(heap_oop)) {
70 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
71 HeapRegion* hr = _g1->heap_region_containing((HeapWord*) obj);
72 if (hr != NULL) {
73 if (hr->in_collection_set())
74 _oc->do_oop(p);
75 else if (!hr->is_young())
76 _cm->grayRoot(obj);
77 }
78 }
79 }
81 // This closure is applied to the fields of the objects that have just been copied.
82 template <class T> inline void G1ParScanClosure::do_oop_nv(T* p) {
83 T heap_oop = oopDesc::load_heap_oop(p);
85 if (!oopDesc::is_null(heap_oop)) {
86 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
87 if (_g1->in_cset_fast_test(obj)) {
88 // We're not going to even bother checking whether the object is
89 // already forwarded or not, as this usually causes an immediate
90 // stall. We'll try to prefetch the object (for write, given that
91 // we might need to install the forwarding reference) and we'll
92 // get back to it when pop it from the queue
93 Prefetch::write(obj->mark_addr(), 0);
94 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
96 // slightly paranoid test; I'm trying to catch potential
97 // problems before we go into push_on_queue to know where the
98 // problem is coming from
99 assert(obj == oopDesc::load_decode_heap_oop(p),
100 "p should still be pointing to obj");
101 _par_scan_state->push_on_queue(p);
102 } else {
103 _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
104 }
105 }
106 }