1 /*
2 * Copyright (c) 2015, 2022, 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 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
27
28 #include "gc/shared/stringdedup/stringDedup.hpp"
29 #include "gc/shenandoah/shenandoahClosures.inline.hpp"
30 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
31 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
32 #include "gc/shenandoah/shenandoahUtils.hpp"
33 #include "memory/iterator.hpp"
34 #include "runtime/javaThread.hpp"
35
36 enum StringDedupMode {
37 NO_DEDUP, // Do not do anything for String deduplication
38 ENQUEUE_DEDUP, // Enqueue candidate Strings for deduplication, if meet age threshold
39 ALWAYS_DEDUP // Enqueue Strings for deduplication
40 };
41
42 class ShenandoahMarkRefsSuperClosure : public MetadataVisitingOopIterateClosure {
43 private:
44 ShenandoahObjToScanQueue* _queue;
45 ShenandoahMarkingContext* const _mark_context;
46 bool _weak;
47
48 protected:
49 template <class T>
50 void work(T *p);
51
52 public:
53 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp);
54
55 bool is_weak() const {
56 return _weak;
57 }
58
59 void set_weak(bool weak) {
60 _weak = weak;
61 }
62
63 virtual void do_nmethod(nmethod* nm) {
64 assert(!is_weak(), "Can't handle weak marking of nmethods");
65 nm->run_nmethod_entry_barrier();
66 }
67 };
68
69 class ShenandoahMarkUpdateRefsSuperClosure : public ShenandoahMarkRefsSuperClosure {
70 protected:
71 ShenandoahHeap* const _heap;
72
73 template <class T>
74 inline void work(T* p);
75
76 public:
77 ShenandoahMarkUpdateRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
78 ShenandoahMarkRefsSuperClosure(q, rp),
79 _heap(ShenandoahHeap::heap()) {
80 assert(_heap->is_stw_gc_in_progress(), "Can only be used for STW GC");
81 };
82 };
83
84 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkUpdateRefsSuperClosure {
85 private:
86 template <class T>
87 inline void do_oop_work(T* p) { work<T>(p); }
88
89 public:
90 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
91 ShenandoahMarkUpdateRefsSuperClosure(q, rp) {}
92
93 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
94 virtual void do_oop(oop* p) { do_oop_work(p); }
95 };
96
97 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
98 private:
99 template <class T>
100 inline void do_oop_work(T* p) { work<T>(p); }
101
102 public:
103 ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
104 ShenandoahMarkRefsSuperClosure(q, rp) {};
105
106 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
107 virtual void do_oop(oop* p) { do_oop_work(p); }
108 };
109
110
111 class ShenandoahUpdateRefsSuperClosure : public ShenandoahOopClosureBase {
112 protected:
113 ShenandoahHeap* _heap;
114
115 public:
116 ShenandoahUpdateRefsSuperClosure() : _heap(ShenandoahHeap::heap()) {}
117 };
118
119 class ShenandoahSTWUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
120 private:
121 template<class T>
122 inline void work(T* p);
123
124 public:
125 ShenandoahSTWUpdateRefsClosure() : ShenandoahUpdateRefsSuperClosure() {
126 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must only be used at safepoints");
127 }
128
129 virtual void do_oop(narrowOop* p) { work(p); }
130 virtual void do_oop(oop* p) { work(p); }
131 };
132
133 class ShenandoahConcUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
134 private:
135 template<class T>
136 inline void work(T* p);
137
138 public:
139 ShenandoahConcUpdateRefsClosure() : ShenandoahUpdateRefsSuperClosure() {}
140
141 virtual void do_oop(narrowOop* p) { work(p); }
142 virtual void do_oop(oop* p) { work(p); }
143 };
144
145 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP