src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp

Mon, 02 Aug 2010 12:51:43 -0700

author
johnc
date
Mon, 02 Aug 2010 12:51:43 -0700
changeset 2060
2d160770d2e5
parent 1907
c18cbe5936b8
child 2314
f95d63e2154a
permissions
-rw-r--r--

6814437: G1: remove the _new_refs array
Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure.
Reviewed-by: iveresov, jmasa, tonyp

ysr@777 1 /*
trims@1907 2 * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 #ifndef SERIALGC
ysr@777 26
ysr@777 27 class DirtyCardQueueSet;
ysr@777 28
ysr@777 29 // This barrier is specialized to use a logging barrier to support
ysr@777 30 // snapshot-at-the-beginning marking.
ysr@777 31
ysr@777 32 class G1SATBCardTableModRefBS: public CardTableModRefBSForCTRS {
ysr@777 33 private:
ysr@777 34 // Add "pre_val" to a set of objects that may have been disconnected from the
ysr@777 35 // pre-marking object graph.
ysr@777 36 static void enqueue(oop pre_val);
ysr@777 37
ysr@777 38 public:
ysr@777 39 G1SATBCardTableModRefBS(MemRegion whole_heap,
ysr@777 40 int max_covered_regions);
ysr@777 41
ysr@777 42 bool is_a(BarrierSet::Name bsn) {
ysr@777 43 return bsn == BarrierSet::G1SATBCT || CardTableModRefBS::is_a(bsn);
ysr@777 44 }
ysr@777 45
ysr@777 46 virtual bool has_write_ref_pre_barrier() { return true; }
ysr@777 47
ysr@777 48 // This notes that we don't need to access any BarrierSet data
ysr@777 49 // structures, so this can be called from a static context.
ysr@1280 50 template <class T> static void write_ref_field_pre_static(T* field, oop newVal) {
ysr@1280 51 T heap_oop = oopDesc::load_heap_oop(field);
ysr@1280 52 if (!oopDesc::is_null(heap_oop)) {
ysr@1280 53 enqueue(oopDesc::decode_heap_oop(heap_oop));
ysr@777 54 }
ysr@777 55 }
ysr@777 56
ysr@777 57 // When we know the current java thread:
ysr@1280 58 template <class T> static void write_ref_field_pre_static(T* field, oop newVal,
ysr@1280 59 JavaThread* jt);
ysr@777 60
ysr@777 61 // We export this to make it available in cases where the static
ysr@777 62 // type of the barrier set is known. Note that it is non-virtual.
ysr@1280 63 template <class T> inline void inline_write_ref_field_pre(T* field, oop newVal) {
ysr@777 64 write_ref_field_pre_static(field, newVal);
ysr@777 65 }
ysr@777 66
ysr@1280 67 // These are the more general virtual versions.
ysr@1280 68 virtual void write_ref_field_pre_work(oop* field, oop new_val) {
ysr@777 69 inline_write_ref_field_pre(field, new_val);
ysr@777 70 }
ysr@1280 71 virtual void write_ref_field_pre_work(narrowOop* field, oop new_val) {
ysr@1280 72 inline_write_ref_field_pre(field, new_val);
ysr@1280 73 }
ysr@1280 74 virtual void write_ref_field_pre_work(void* field, oop new_val) {
ysr@1280 75 guarantee(false, "Not needed");
ysr@1280 76 }
ysr@777 77
ysr@1280 78 template <class T> void write_ref_array_pre_work(T* dst, int count);
ysr@1280 79 virtual void write_ref_array_pre(oop* dst, int count) {
ysr@1280 80 write_ref_array_pre_work(dst, count);
ysr@1280 81 }
ysr@1280 82 virtual void write_ref_array_pre(narrowOop* dst, int count) {
ysr@1280 83 write_ref_array_pre_work(dst, count);
ysr@1280 84 }
ysr@777 85 };
ysr@777 86
ysr@777 87 // Adds card-table logging to the post-barrier.
ysr@777 88 // Usual invariant: all dirty cards are logged in the DirtyCardQueueSet.
ysr@777 89 class G1SATBCardTableLoggingModRefBS: public G1SATBCardTableModRefBS {
ysr@777 90 private:
ysr@777 91 DirtyCardQueueSet& _dcqs;
ysr@777 92 public:
ysr@777 93 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
ysr@777 94 int max_covered_regions);
ysr@777 95
ysr@777 96 bool is_a(BarrierSet::Name bsn) {
ysr@777 97 return bsn == BarrierSet::G1SATBCTLogging ||
ysr@777 98 G1SATBCardTableModRefBS::is_a(bsn);
ysr@777 99 }
ysr@777 100
ysr@777 101 void write_ref_field_work(void* field, oop new_val);
ysr@777 102
ysr@777 103 // Can be called from static contexts.
ysr@777 104 static void write_ref_field_static(void* field, oop new_val);
ysr@777 105
ysr@777 106 // NB: if you do a whole-heap invalidation, the "usual invariant" defined
ysr@777 107 // above no longer applies.
ysr@777 108 void invalidate(MemRegion mr, bool whole_heap = false);
ysr@777 109
ysr@777 110 void write_region_work(MemRegion mr) { invalidate(mr); }
ysr@777 111 void write_ref_array_work(MemRegion mr) { invalidate(mr); }
ysr@777 112
ysr@777 113
ysr@777 114 };
ysr@777 115
ysr@777 116
ysr@777 117 #endif // SERIALGC

mercurial