Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/z/zBarrier.hpp
40957 views
1
/*
2
* Copyright (c) 2015, 2021, 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
#ifndef SHARE_GC_Z_ZBARRIER_HPP
25
#define SHARE_GC_Z_ZBARRIER_HPP
26
27
#include "memory/allocation.hpp"
28
#include "memory/iterator.hpp"
29
#include "oops/oop.hpp"
30
31
typedef bool (*ZBarrierFastPath)(uintptr_t);
32
typedef uintptr_t (*ZBarrierSlowPath)(uintptr_t);
33
34
class ZBarrier : public AllStatic {
35
private:
36
static const bool GCThread = true;
37
static const bool AnyThread = false;
38
39
static const bool Follow = true;
40
static const bool DontFollow = false;
41
42
static const bool Strong = false;
43
static const bool Finalizable = true;
44
45
static const bool Publish = true;
46
static const bool Overflow = false;
47
48
template <ZBarrierFastPath fast_path> static void self_heal(volatile oop* p, uintptr_t addr, uintptr_t heal_addr);
49
50
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path> static oop barrier(volatile oop* p, oop o);
51
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path> static oop weak_barrier(volatile oop* p, oop o);
52
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path> static void root_barrier(oop* p, oop o);
53
54
static bool is_good_or_null_fast_path(uintptr_t addr);
55
static bool is_weak_good_or_null_fast_path(uintptr_t addr);
56
static bool is_marked_or_null_fast_path(uintptr_t addr);
57
58
static bool during_mark();
59
static bool during_relocate();
60
template <bool finalizable> static bool should_mark_through(uintptr_t addr);
61
template <bool gc_thread, bool follow, bool finalizable, bool publish> static uintptr_t mark(uintptr_t addr);
62
static uintptr_t remap(uintptr_t addr);
63
static uintptr_t relocate(uintptr_t addr);
64
static uintptr_t relocate_or_mark(uintptr_t addr);
65
static uintptr_t relocate_or_mark_no_follow(uintptr_t addr);
66
static uintptr_t relocate_or_remap(uintptr_t addr);
67
68
static uintptr_t load_barrier_on_oop_slow_path(uintptr_t addr);
69
static uintptr_t load_barrier_on_invisible_root_oop_slow_path(uintptr_t addr);
70
71
static uintptr_t weak_load_barrier_on_oop_slow_path(uintptr_t addr);
72
static uintptr_t weak_load_barrier_on_weak_oop_slow_path(uintptr_t addr);
73
static uintptr_t weak_load_barrier_on_phantom_oop_slow_path(uintptr_t addr);
74
75
static uintptr_t keep_alive_barrier_on_oop_slow_path(uintptr_t addr);
76
static uintptr_t keep_alive_barrier_on_weak_oop_slow_path(uintptr_t addr);
77
static uintptr_t keep_alive_barrier_on_phantom_oop_slow_path(uintptr_t addr);
78
79
static uintptr_t mark_barrier_on_oop_slow_path(uintptr_t addr);
80
static uintptr_t mark_barrier_on_finalizable_oop_slow_path(uintptr_t addr);
81
82
static void verify_on_weak(volatile oop* referent_addr) NOT_DEBUG_RETURN;
83
84
public:
85
// Load barrier
86
static oop load_barrier_on_oop(oop o);
87
static oop load_barrier_on_oop_field(volatile oop* p);
88
static oop load_barrier_on_oop_field_preloaded(volatile oop* p, oop o);
89
static void load_barrier_on_oop_array(volatile oop* p, size_t length);
90
static void load_barrier_on_oop_fields(oop o);
91
static oop load_barrier_on_weak_oop_field_preloaded(volatile oop* p, oop o);
92
static oop load_barrier_on_phantom_oop_field_preloaded(volatile oop* p, oop o);
93
static void load_barrier_on_root_oop_field(oop* p);
94
static void load_barrier_on_invisible_root_oop_field(oop* p);
95
96
// Weak load barrier
97
static oop weak_load_barrier_on_oop_field(volatile oop* p);
98
static oop weak_load_barrier_on_oop_field_preloaded(volatile oop* p, oop o);
99
static oop weak_load_barrier_on_weak_oop(oop o);
100
static oop weak_load_barrier_on_weak_oop_field(volatile oop* p);
101
static oop weak_load_barrier_on_weak_oop_field_preloaded(volatile oop* p, oop o);
102
static oop weak_load_barrier_on_phantom_oop(oop o);
103
static oop weak_load_barrier_on_phantom_oop_field(volatile oop* p);
104
static oop weak_load_barrier_on_phantom_oop_field_preloaded(volatile oop* p, oop o);
105
106
// Is alive barrier
107
static bool is_alive_barrier_on_weak_oop(oop o);
108
static bool is_alive_barrier_on_phantom_oop(oop o);
109
110
// Keep alive barrier
111
static void keep_alive_barrier_on_oop(oop o);
112
static void keep_alive_barrier_on_weak_oop_field(volatile oop* p);
113
static void keep_alive_barrier_on_phantom_oop_field(volatile oop* p);
114
static void keep_alive_barrier_on_phantom_root_oop_field(oop* p);
115
116
// Mark barrier
117
static void mark_barrier_on_oop_field(volatile oop* p, bool finalizable);
118
static void mark_barrier_on_oop_array(volatile oop* p, size_t length, bool finalizable);
119
static void mark_barrier_on_invisible_root_oop_field(oop* p);
120
121
// Narrow oop variants, never used.
122
static oop load_barrier_on_oop_field(volatile narrowOop* p);
123
static oop load_barrier_on_oop_field_preloaded(volatile narrowOop* p, oop o);
124
static void load_barrier_on_oop_array(volatile narrowOop* p, size_t length);
125
static oop load_barrier_on_weak_oop_field_preloaded(volatile narrowOop* p, oop o);
126
static oop load_barrier_on_phantom_oop_field_preloaded(volatile narrowOop* p, oop o);
127
static oop weak_load_barrier_on_oop_field_preloaded(volatile narrowOop* p, oop o);
128
static oop weak_load_barrier_on_weak_oop_field_preloaded(volatile narrowOop* p, oop o);
129
static oop weak_load_barrier_on_phantom_oop_field_preloaded(volatile narrowOop* p, oop o);
130
};
131
132
class ZLoadBarrierOopClosure : public BasicOopIterateClosure {
133
public:
134
virtual void do_oop(oop* p);
135
virtual void do_oop(narrowOop* p);
136
};
137
138
#endif // SHARE_GC_Z_ZBARRIER_HPP
139
140