Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
40957 views
1
/*
2
* Copyright (c) 2013, 2021, Red Hat, 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 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
#include "precompiled.hpp"
26
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
27
#include "gc/shenandoah/shenandoahBarrierSetClone.inline.hpp"
28
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
29
#include "gc/shenandoah/shenandoahBarrierSetNMethod.hpp"
30
#include "gc/shenandoah/shenandoahClosures.inline.hpp"
31
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
32
#include "gc/shenandoah/shenandoahStackWatermark.hpp"
33
#ifdef COMPILER1
34
#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
35
#endif
36
#ifdef COMPILER2
37
#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
38
#endif
39
40
class ShenandoahBarrierSetC1;
41
class ShenandoahBarrierSetC2;
42
43
ShenandoahBarrierSet::ShenandoahBarrierSet(ShenandoahHeap* heap) :
44
BarrierSet(make_barrier_set_assembler<ShenandoahBarrierSetAssembler>(),
45
make_barrier_set_c1<ShenandoahBarrierSetC1>(),
46
make_barrier_set_c2<ShenandoahBarrierSetC2>(),
47
ShenandoahNMethodBarrier ? new ShenandoahBarrierSetNMethod(heap) : NULL,
48
BarrierSet::FakeRtti(BarrierSet::ShenandoahBarrierSet)),
49
_heap(heap),
50
_satb_mark_queue_buffer_allocator("SATB Buffer Allocator", ShenandoahSATBBufferSize),
51
_satb_mark_queue_set(&_satb_mark_queue_buffer_allocator)
52
{
53
}
54
55
ShenandoahBarrierSetAssembler* ShenandoahBarrierSet::assembler() {
56
BarrierSetAssembler* const bsa = BarrierSet::barrier_set()->barrier_set_assembler();
57
return reinterpret_cast<ShenandoahBarrierSetAssembler*>(bsa);
58
}
59
60
void ShenandoahBarrierSet::print_on(outputStream* st) const {
61
st->print("ShenandoahBarrierSet");
62
}
63
64
bool ShenandoahBarrierSet::need_load_reference_barrier(DecoratorSet decorators, BasicType type) {
65
if (!ShenandoahLoadRefBarrier) return false;
66
// Only needed for references
67
return is_reference_type(type);
68
}
69
70
bool ShenandoahBarrierSet::need_keep_alive_barrier(DecoratorSet decorators, BasicType type) {
71
if (!ShenandoahSATBBarrier) return false;
72
// Only needed for references
73
if (!is_reference_type(type)) return false;
74
75
bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
76
bool unknown = (decorators & ON_UNKNOWN_OOP_REF) != 0;
77
bool on_weak_ref = (decorators & (ON_WEAK_OOP_REF | ON_PHANTOM_OOP_REF)) != 0;
78
return (on_weak_ref || unknown) && keep_alive;
79
}
80
81
void ShenandoahBarrierSet::on_thread_create(Thread* thread) {
82
// Create thread local data
83
ShenandoahThreadLocalData::create(thread);
84
}
85
86
void ShenandoahBarrierSet::on_thread_destroy(Thread* thread) {
87
// Destroy thread local data
88
ShenandoahThreadLocalData::destroy(thread);
89
}
90
91
void ShenandoahBarrierSet::on_thread_attach(Thread *thread) {
92
assert(!thread->is_Java_thread() || !SafepointSynchronize::is_at_safepoint(),
93
"We should not be at a safepoint");
94
SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
95
assert(!queue.is_active(), "SATB queue should not be active");
96
assert(queue.buffer() == nullptr, "SATB queue should not have a buffer");
97
assert(queue.index() == 0, "SATB queue index should be zero");
98
queue.set_active(_satb_mark_queue_set.is_active());
99
if (thread->is_Java_thread()) {
100
ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state());
101
ShenandoahThreadLocalData::initialize_gclab(thread);
102
ShenandoahThreadLocalData::set_disarmed_value(thread, ShenandoahCodeRoots::disarmed_value());
103
104
if (ShenandoahStackWatermarkBarrier) {
105
JavaThread* const jt = thread->as_Java_thread();
106
StackWatermark* const watermark = new ShenandoahStackWatermark(jt);
107
StackWatermarkSet::add_watermark(jt, watermark);
108
}
109
}
110
}
111
112
void ShenandoahBarrierSet::on_thread_detach(Thread *thread) {
113
SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
114
_satb_mark_queue_set.flush_queue(queue);
115
if (thread->is_Java_thread()) {
116
PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
117
if (gclab != NULL) {
118
gclab->retire();
119
}
120
121
// SATB protocol requires to keep alive reacheable oops from roots at the beginning of GC
122
if (ShenandoahStackWatermarkBarrier) {
123
if (_heap->is_concurrent_mark_in_progress()) {
124
ShenandoahKeepAliveClosure oops;
125
StackWatermarkSet::finish_processing(thread->as_Java_thread(), &oops, StackWatermarkKind::gc);
126
} else if (_heap->is_concurrent_weak_root_in_progress() && _heap->is_evacuation_in_progress()) {
127
ShenandoahContextEvacuateUpdateRootsClosure oops;
128
StackWatermarkSet::finish_processing(thread->as_Java_thread(), &oops, StackWatermarkKind::gc);
129
}
130
}
131
}
132
}
133
134
void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
135
if (_heap->has_forwarded_objects() || (ShenandoahIUBarrier && _heap->is_concurrent_mark_in_progress())) {
136
clone_barrier(src);
137
}
138
}
139
140