Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/memory/genOopClosures.inline.hpp
32285 views
1
/*
2
* Copyright (c) 2001, 2012, 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_VM_MEMORY_GENOOPCLOSURES_INLINE_HPP
26
#define SHARE_VM_MEMORY_GENOOPCLOSURES_INLINE_HPP
27
28
#include "memory/cardTableRS.hpp"
29
#include "memory/defNewGeneration.hpp"
30
#include "memory/genCollectedHeap.hpp"
31
#include "memory/genOopClosures.hpp"
32
#include "memory/genRemSet.hpp"
33
#include "memory/generation.hpp"
34
#include "memory/sharedHeap.hpp"
35
#include "memory/space.hpp"
36
37
inline OopsInGenClosure::OopsInGenClosure(Generation* gen) :
38
ExtendedOopClosure(gen->ref_processor()), _orig_gen(gen), _rs(NULL) {
39
set_generation(gen);
40
}
41
42
inline void OopsInGenClosure::set_generation(Generation* gen) {
43
_gen = gen;
44
_gen_boundary = _gen->reserved().start();
45
// Barrier set for the heap, must be set after heap is initialized
46
if (_rs == NULL) {
47
GenRemSet* rs = SharedHeap::heap()->rem_set();
48
assert(rs->rs_kind() == GenRemSet::CardTable, "Wrong rem set kind");
49
_rs = (CardTableRS*)rs;
50
}
51
}
52
53
template <class T> inline void OopsInGenClosure::do_barrier(T* p) {
54
assert(generation()->is_in_reserved(p), "expected ref in generation");
55
T heap_oop = oopDesc::load_heap_oop(p);
56
assert(!oopDesc::is_null(heap_oop), "expected non-null oop");
57
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
58
// If p points to a younger generation, mark the card.
59
if ((HeapWord*)obj < _gen_boundary) {
60
_rs->inline_write_ref_field_gc(p, obj);
61
}
62
}
63
64
template <class T> inline void OopsInGenClosure::par_do_barrier(T* p) {
65
assert(generation()->is_in_reserved(p), "expected ref in generation");
66
T heap_oop = oopDesc::load_heap_oop(p);
67
assert(!oopDesc::is_null(heap_oop), "expected non-null oop");
68
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
69
// If p points to a younger generation, mark the card.
70
if ((HeapWord*)obj < gen_boundary()) {
71
rs()->write_ref_field_gc_par(p, obj);
72
}
73
}
74
75
inline void OopsInKlassOrGenClosure::do_klass_barrier() {
76
assert(_scanned_klass != NULL, "Must be");
77
_scanned_klass->record_modified_oops();
78
}
79
80
// NOTE! Any changes made here should also be made
81
// in FastScanClosure::do_oop_work()
82
template <class T> inline void ScanClosure::do_oop_work(T* p) {
83
T heap_oop = oopDesc::load_heap_oop(p);
84
// Should we copy the obj?
85
if (!oopDesc::is_null(heap_oop)) {
86
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
87
if ((HeapWord*)obj < _boundary) {
88
assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
89
oop new_obj = obj->is_forwarded() ? obj->forwardee()
90
: _g->copy_to_survivor_space(obj);
91
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
92
}
93
94
if (is_scanning_a_klass()) {
95
do_klass_barrier();
96
} else if (_gc_barrier) {
97
// Now call parent closure
98
do_barrier(p);
99
}
100
}
101
}
102
103
inline void ScanClosure::do_oop_nv(oop* p) { ScanClosure::do_oop_work(p); }
104
inline void ScanClosure::do_oop_nv(narrowOop* p) { ScanClosure::do_oop_work(p); }
105
106
// NOTE! Any changes made here should also be made
107
// in ScanClosure::do_oop_work()
108
template <class T> inline void FastScanClosure::do_oop_work(T* p) {
109
T heap_oop = oopDesc::load_heap_oop(p);
110
// Should we copy the obj?
111
if (!oopDesc::is_null(heap_oop)) {
112
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
113
if ((HeapWord*)obj < _boundary) {
114
assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
115
oop new_obj = obj->is_forwarded() ? obj->forwardee()
116
: _g->copy_to_survivor_space(obj);
117
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
118
if (is_scanning_a_klass()) {
119
do_klass_barrier();
120
} else if (_gc_barrier) {
121
// Now call parent closure
122
do_barrier(p);
123
}
124
}
125
}
126
}
127
128
inline void FastScanClosure::do_oop_nv(oop* p) { FastScanClosure::do_oop_work(p); }
129
inline void FastScanClosure::do_oop_nv(narrowOop* p) { FastScanClosure::do_oop_work(p); }
130
131
// Note similarity to ScanClosure; the difference is that
132
// the barrier set is taken care of outside this closure.
133
template <class T> inline void ScanWeakRefClosure::do_oop_work(T* p) {
134
assert(!oopDesc::is_null(*p), "null weak reference?");
135
oop obj = oopDesc::load_decode_heap_oop_not_null(p);
136
// weak references are sometimes scanned twice; must check
137
// that to-space doesn't already contain this object
138
if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) {
139
oop new_obj = obj->is_forwarded() ? obj->forwardee()
140
: _g->copy_to_survivor_space(obj);
141
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
142
}
143
}
144
145
inline void ScanWeakRefClosure::do_oop_nv(oop* p) { ScanWeakRefClosure::do_oop_work(p); }
146
inline void ScanWeakRefClosure::do_oop_nv(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }
147
148
#endif // SHARE_VM_MEMORY_GENOOPCLOSURES_INLINE_HPP
149
150