Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp
40957 views
1
/*
2
* Copyright (c) 2016, 2020, 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
*
23
*/
24
25
#ifndef SHARE_GC_G1_G1BARRIERSET_INLINE_HPP
26
#define SHARE_GC_G1_G1BARRIERSET_INLINE_HPP
27
28
#include "gc/g1/g1BarrierSet.hpp"
29
30
#include "gc/g1/g1CardTable.hpp"
31
#include "gc/shared/accessBarrierSupport.inline.hpp"
32
#include "oops/access.inline.hpp"
33
#include "oops/compressedOops.inline.hpp"
34
#include "oops/oop.hpp"
35
36
template <DecoratorSet decorators, typename T>
37
inline void G1BarrierSet::write_ref_field_pre(T* field) {
38
if (HasDecorator<decorators, IS_DEST_UNINITIALIZED>::value ||
39
HasDecorator<decorators, AS_NO_KEEPALIVE>::value) {
40
return;
41
}
42
43
T heap_oop = RawAccess<MO_RELAXED>::oop_load(field);
44
if (!CompressedOops::is_null(heap_oop)) {
45
enqueue(CompressedOops::decode_not_null(heap_oop));
46
}
47
}
48
49
template <DecoratorSet decorators, typename T>
50
inline void G1BarrierSet::write_ref_field_post(T* field, oop new_val) {
51
volatile CardValue* byte = _card_table->byte_for(field);
52
if (*byte != G1CardTable::g1_young_card_val()) {
53
// Take a slow path for cards in old
54
write_ref_field_post_slow(byte);
55
}
56
}
57
58
inline void G1BarrierSet::enqueue_if_weak(DecoratorSet decorators, oop value) {
59
assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
60
// Loading from a weak or phantom reference needs enqueueing, as
61
// the object may not have been reachable (part of the snapshot)
62
// when marking started.
63
const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
64
const bool peek = (decorators & AS_NO_KEEPALIVE) != 0;
65
const bool needs_enqueue = (!peek && !on_strong_oop_ref);
66
67
if (needs_enqueue && value != NULL) {
68
enqueue(value);
69
}
70
}
71
72
template <DecoratorSet decorators, typename BarrierSetT>
73
template <typename T>
74
inline oop G1BarrierSet::AccessBarrier<decorators, BarrierSetT>::
75
oop_load_not_in_heap(T* addr) {
76
oop value = ModRef::oop_load_not_in_heap(addr);
77
enqueue_if_weak(decorators, value);
78
return value;
79
}
80
81
template <DecoratorSet decorators, typename BarrierSetT>
82
template <typename T>
83
inline oop G1BarrierSet::AccessBarrier<decorators, BarrierSetT>::
84
oop_load_in_heap(T* addr) {
85
oop value = ModRef::oop_load_in_heap(addr);
86
enqueue_if_weak(decorators, value);
87
return value;
88
}
89
90
template <DecoratorSet decorators, typename BarrierSetT>
91
inline oop G1BarrierSet::AccessBarrier<decorators, BarrierSetT>::
92
oop_load_in_heap_at(oop base, ptrdiff_t offset) {
93
oop value = ModRef::oop_load_in_heap_at(base, offset);
94
enqueue_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), value);
95
return value;
96
}
97
98
template <DecoratorSet decorators, typename BarrierSetT>
99
template <typename T>
100
inline void G1BarrierSet::AccessBarrier<decorators, BarrierSetT>::
101
oop_store_not_in_heap(T* addr, oop new_value) {
102
// Apply SATB barriers for all non-heap references, to allow
103
// concurrent scanning of such references.
104
G1BarrierSet *bs = barrier_set_cast<G1BarrierSet>(BarrierSet::barrier_set());
105
bs->write_ref_field_pre<decorators>(addr);
106
Raw::oop_store(addr, new_value);
107
}
108
109
#endif // SHARE_GC_G1_G1BARRIERSET_INLINE_HPP
110
111