1 /*
2 * Copyright (c) 2001, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
41 friend class VMStructs;
42 protected:
43 enum G1CardValues {
44 g1_young_gen = CT_MR_BS_last_reserved << 1
45 };
46
47 G1SATBCardTableModRefBS(MemRegion whole_heap, const BarrierSet::FakeRtti& fake_rtti);
48 ~G1SATBCardTableModRefBS() { }
49
50 public:
51 static int g1_young_card_val() { return g1_young_gen; }
52
53 // Add "pre_val" to a set of objects that may have been disconnected from the
54 // pre-marking object graph.
55 static void enqueue(oop pre_val);
56
57 virtual bool has_write_ref_pre_barrier() { return true; }
58
59 // We export this to make it available in cases where the static
60 // type of the barrier set is known. Note that it is non-virtual.
61 template <class T> inline void inline_write_ref_field_pre(T* field, oop newVal) {
62 T heap_oop = oopDesc::load_heap_oop(field);
63 if (!oopDesc::is_null(heap_oop)) {
64 enqueue(oopDesc::decode_heap_oop(heap_oop));
65 }
66 }
67
68 // These are the more general virtual versions.
69 virtual void write_ref_field_pre_work(oop* field, oop new_val) {
70 inline_write_ref_field_pre(field, new_val);
71 }
72 virtual void write_ref_field_pre_work(narrowOop* field, oop new_val) {
73 inline_write_ref_field_pre(field, new_val);
74 }
75 virtual void write_ref_field_pre_work(void* field, oop new_val) {
76 guarantee(false, "Not needed");
77 }
78
79 template <class T> void write_ref_array_pre_work(T* dst, int count);
80 virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized);
81 virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized);
82
83 /*
84 Claimed and deferred bits are used together in G1 during the evacuation
85 pause. These bits can have the following state transitions:
86 1. The claimed bit can be put over any other card state. Except that
87 the "dirty -> dirty and claimed" transition is checked for in
88 G1 code and is not used.
89 2. Deferred bit can be set only if the previous state of the card
90 was either clean or claimed. mark_card_deferred() is wait-free.
91 We do not care if the operation is be successful because if
92 it does not it will only result in duplicate entry in the update
93 buffer because of the "cache-miss". So it's not worth spinning.
94 */
95
96 bool is_card_claimed(size_t card_index) {
97 jbyte val = _byte_map[card_index];
98 return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val();
99 }
100
101 void set_card_claimed(size_t card_index) {
102 jbyte val = _byte_map[card_index];
103 if (val == clean_card_val()) {
104 val = (jbyte)claimed_card_val();
105 } else {
106 val |= (jbyte)claimed_card_val();
107 }
108 _byte_map[card_index] = val;
109 }
110
111 void verify_g1_young_region(MemRegion mr) PRODUCT_RETURN;
112 void g1_mark_as_young(const MemRegion& mr);
113
114 bool mark_card_deferred(size_t card_index);
115
116 bool is_card_deferred(size_t card_index) {
117 jbyte val = _byte_map[card_index];
118 return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val();
119 }
120 virtual void write_ref_nmethod_pre(oop* dst, nmethod* nm);
121 virtual void write_ref_nmethod_post(oop* dst, nmethod* nm);
122
123 };
124
125 template<>
126 struct BarrierSet::GetName<G1SATBCardTableModRefBS> {
127 static const BarrierSet::Name value = BarrierSet::G1SATBCT;
128 };
129
|
1 /*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
41 friend class VMStructs;
42 protected:
43 enum G1CardValues {
44 g1_young_gen = CT_MR_BS_last_reserved << 1
45 };
46
47 G1SATBCardTableModRefBS(MemRegion whole_heap, const BarrierSet::FakeRtti& fake_rtti);
48 ~G1SATBCardTableModRefBS() { }
49
50 public:
51 static int g1_young_card_val() { return g1_young_gen; }
52
53 // Add "pre_val" to a set of objects that may have been disconnected from the
54 // pre-marking object graph.
55 static void enqueue(oop pre_val);
56
57 virtual bool has_write_ref_pre_barrier() { return true; }
58
59 // We export this to make it available in cases where the static
60 // type of the barrier set is known. Note that it is non-virtual.
61 template <class T> inline void inline_write_ref_field_pre(T* field, oop newVal);
62
63 // These are the more general virtual versions.
64 inline virtual void write_ref_field_pre_work(oop* field, oop new_val);
65 inline virtual void write_ref_field_pre_work(narrowOop* field, oop new_val);
66 virtual void write_ref_field_pre_work(void* field, oop new_val) {
67 guarantee(false, "Not needed");
68 }
69
70 template <class T> void write_ref_array_pre_work(T* dst, int count);
71 virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized);
72 virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized);
73
74 /*
75 Claimed and deferred bits are used together in G1 during the evacuation
76 pause. These bits can have the following state transitions:
77 1. The claimed bit can be put over any other card state. Except that
78 the "dirty -> dirty and claimed" transition is checked for in
79 G1 code and is not used.
80 2. Deferred bit can be set only if the previous state of the card
81 was either clean or claimed. mark_card_deferred() is wait-free.
82 We do not care if the operation is be successful because if
83 it does not it will only result in duplicate entry in the update
84 buffer because of the "cache-miss". So it's not worth spinning.
85 */
86
87 bool is_card_claimed(size_t card_index) {
88 jbyte val = _byte_map[card_index];
89 return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val();
90 }
91
92 inline void set_card_claimed(size_t card_index);
93
94 void verify_g1_young_region(MemRegion mr) PRODUCT_RETURN;
95 void g1_mark_as_young(const MemRegion& mr);
96
97 bool mark_card_deferred(size_t card_index);
98
99 bool is_card_deferred(size_t card_index) {
100 jbyte val = _byte_map[card_index];
101 return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val();
102 }
103 virtual void write_ref_nmethod_pre(oop* dst, nmethod* nm);
104 virtual void write_ref_nmethod_post(oop* dst, nmethod* nm);
105
106 };
107
108 template<>
109 struct BarrierSet::GetName<G1SATBCardTableModRefBS> {
110 static const BarrierSet::Name value = BarrierSet::G1SATBCT;
111 };
112
|