1 /*
2  * Copyright (c) 2019, 2020, 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 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHCLOSURES_HPP
25 #define SHARE_GC_SHENANDOAH_SHENANDOAHCLOSURES_HPP
26 
27 #include "memory/iterator.hpp"
28 #include "oops/accessDecorators.hpp"
29 #include "runtime/handshake.hpp"
30 
31 class ShenandoahHeap;
32 class ShenandoahMarkingContext;
33 class ShenandoahHeapRegionSet;
34 class Thread;
35 
36 class ShenandoahForwardedIsAliveClosure: public BoolObjectClosure {
37 private:
38   ShenandoahMarkingContext* const _mark_context;
39 public:
40   inline ShenandoahForwardedIsAliveClosure();
41   inline bool do_object_b(oop obj);
42 };
43 
44 class ShenandoahIsAliveClosure: public BoolObjectClosure {
45 private:
46   ShenandoahMarkingContext* const _mark_context;
47 public:
48   inline ShenandoahIsAliveClosure();
49   inline bool do_object_b(oop obj);
50 };
51 
52 class ShenandoahIsAliveSelector : public StackObj {
53 private:
54   ShenandoahIsAliveClosure _alive_cl;
55   ShenandoahForwardedIsAliveClosure _fwd_alive_cl;
56 public:
57   inline BoolObjectClosure* is_alive_closure();
58 };
59 
60 class ShenandoahUpdateRefsClosure: public OopClosure {
61 private:
62   ShenandoahHeap* _heap;
63 public:
64   inline ShenandoahUpdateRefsClosure();
65   inline void do_oop(oop* p);
66   inline void do_oop(narrowOop* p);
67 private:
68   template <class T>
69   inline void do_oop_work(T* p);
70 };
71 
72 template <DecoratorSet MO = MO_UNORDERED>
73 class ShenandoahEvacuateUpdateRootsClosure: public BasicOopIterateClosure {
74 private:
75   ShenandoahHeap* _heap;
76   Thread* _thread;
77 public:
78   inline ShenandoahEvacuateUpdateRootsClosure();
79   inline void do_oop(oop* p);
80   inline void do_oop(narrowOop* p);
81 
82 private:
83   template <class T>
84   inline void do_oop_work(T* p);
85 };
86 
87 class ShenandoahEvacUpdateOopStorageRootsClosure : public BasicOopIterateClosure {
88 private:
89   ShenandoahHeap* _heap;
90   Thread* _thread;
91 public:
92   inline ShenandoahEvacUpdateOopStorageRootsClosure();
93   inline void do_oop(oop* p);
94   inline void do_oop(narrowOop* p);
95 };
96 
97 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
98 class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure {
99 private:
100   IsAlive*    _is_alive;
101   KeepAlive*  _keep_alive;
102 
103 public:
104   inline ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive);
105   inline void do_oop(oop* p);
106   inline void do_oop(narrowOop* p);
107 };
108 
109 class ShenandoahCodeBlobAndDisarmClosure: public CodeBlobToOopClosure {
110 private:
111   BarrierSetNMethod* const _bs;
112 
113 public:
114   inline ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl);
115   inline void do_code_blob(CodeBlob* cb);
116 };
117 
118 class ShenandoahRendezvousClosure : public HandshakeClosure {
119 public:
120   inline ShenandoahRendezvousClosure();
121   inline void do_thread(Thread* thread);
122 };
123 
124 #ifdef ASSERT
125 class ShenandoahAssertNotForwardedClosure : public OopClosure {
126 private:
127   template <class T>
128   inline void do_oop_work(T* p);
129 
130 public:
131   inline void do_oop(narrowOop* p);
132   inline void do_oop(oop* p);
133 };
134 #endif // ASSERT
135 
136 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCLOSURES_HPP
137