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_ZROOTSITERATOR_HPP
25 #define SHARE_GC_Z_ZROOTSITERATOR_HPP
26
27 #include "gc/shared/oopStorageParState.hpp"
28 #include "gc/shared/suspendibleThreadSet.hpp"
29 #include "memory/allocation.hpp"
30 #include "memory/iterator.hpp"
31 #include "runtime/thread.hpp"
32 #include "utilities/globalDefinitions.hpp"
33
34 class ZRootsIteratorClosure : public OopClosure {
35 public:
36 virtual void do_thread(Thread* thread) {}
37 };
38
39 typedef OopStorage::ParState<true /* concurrent */, false /* is_const */> ZOopStorageIterator;
40
41 template <typename T, void (T::*F)(ZRootsIteratorClosure*)>
42 class ZSerialOopsDo {
43 private:
44 T* const _iter;
45 volatile bool _claimed;
46
47 public:
48 ZSerialOopsDo(T* iter);
49 void oops_do(ZRootsIteratorClosure* cl);
50 };
51
52 template <typename T, void (T::*F)(ZRootsIteratorClosure*)>
53 class ZParallelOopsDo {
54 private:
55 T* const _iter;
56 volatile bool _completed;
57
65 private:
66 T* const _iter;
67 volatile bool _claimed;
68
69 public:
70 ZSerialWeakOopsDo(T* iter);
71 void weak_oops_do(BoolObjectClosure* is_alive, ZRootsIteratorClosure* cl);
72 };
73
74 template <typename T, void (T::*F)(BoolObjectClosure*, ZRootsIteratorClosure*)>
75 class ZParallelWeakOopsDo {
76 private:
77 T* const _iter;
78 volatile bool _completed;
79
80 public:
81 ZParallelWeakOopsDo(T* iter);
82 void weak_oops_do(BoolObjectClosure* is_alive, ZRootsIteratorClosure* cl);
83 };
84
85 class ZRootsIterator {
86 private:
87 const bool _visit_jvmti_weak_export;
88 const bool _disarm_nmethods;
89
90 void do_universe(ZRootsIteratorClosure* cl);
91 void do_object_synchronizer(ZRootsIteratorClosure* cl);
92 void do_management(ZRootsIteratorClosure* cl);
93 void do_jvmti_export(ZRootsIteratorClosure* cl);
94 void do_jvmti_weak_export(ZRootsIteratorClosure* cl);
95 void do_system_dictionary(ZRootsIteratorClosure* cl);
96 void do_threads(ZRootsIteratorClosure* cl);
97 void do_code_cache(ZRootsIteratorClosure* cl);
98
99 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_universe> _universe;
100 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_object_synchronizer> _object_synchronizer;
101 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_management> _management;
102 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_jvmti_export> _jvmti_export;
103 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_jvmti_weak_export> _jvmti_weak_export;
104 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_system_dictionary> _system_dictionary;
105 ZParallelOopsDo<ZRootsIterator, &ZRootsIterator::do_threads> _threads;
106 ZParallelOopsDo<ZRootsIterator, &ZRootsIterator::do_code_cache> _code_cache;
107
108 public:
109 ZRootsIterator(bool visit_jvmti_weak_export = false, bool disarm_nmethod = false);
110 ~ZRootsIterator();
111
112 void oops_do(ZRootsIteratorClosure* cl);
113 };
114
115 class ZConcurrentRootsIterator {
116 private:
117 ZOopStorageIterator _jni_handles_iter;
118 ZOopStorageIterator _vm_handles_iter;
119 const int _cld_claim;
120
121 void do_jni_handles(ZRootsIteratorClosure* cl);
122 void do_vm_handles(ZRootsIteratorClosure* cl);
123 void do_class_loader_data_graph(ZRootsIteratorClosure* cl);
124
125 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_jni_handles> _jni_handles;
126 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_vm_handles> _vm_handles;
127 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_class_loader_data_graph> _class_loader_data_graph;
128
129 public:
|
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_ZROOTSITERATOR_HPP
25 #define SHARE_GC_Z_ZROOTSITERATOR_HPP
26
27 #include "gc/shared/oopStorageParState.hpp"
28 #include "gc/shared/suspendibleThreadSet.hpp"
29 #include "memory/allocation.hpp"
30 #include "memory/iterator.hpp"
31 #include "runtime/thread.hpp"
32 #include "utilities/globalDefinitions.hpp"
33
34 class ZRootsIteratorClosure;
35
36 typedef OopStorage::ParState<true /* concurrent */, false /* is_const */> ZOopStorageIterator;
37
38 template <typename T, void (T::*F)(ZRootsIteratorClosure*)>
39 class ZSerialOopsDo {
40 private:
41 T* const _iter;
42 volatile bool _claimed;
43
44 public:
45 ZSerialOopsDo(T* iter);
46 void oops_do(ZRootsIteratorClosure* cl);
47 };
48
49 template <typename T, void (T::*F)(ZRootsIteratorClosure*)>
50 class ZParallelOopsDo {
51 private:
52 T* const _iter;
53 volatile bool _completed;
54
62 private:
63 T* const _iter;
64 volatile bool _claimed;
65
66 public:
67 ZSerialWeakOopsDo(T* iter);
68 void weak_oops_do(BoolObjectClosure* is_alive, ZRootsIteratorClosure* cl);
69 };
70
71 template <typename T, void (T::*F)(BoolObjectClosure*, ZRootsIteratorClosure*)>
72 class ZParallelWeakOopsDo {
73 private:
74 T* const _iter;
75 volatile bool _completed;
76
77 public:
78 ZParallelWeakOopsDo(T* iter);
79 void weak_oops_do(BoolObjectClosure* is_alive, ZRootsIteratorClosure* cl);
80 };
81
82 class ZRootsIteratorClosure : public OopClosure {
83 public:
84 virtual void do_thread(Thread* thread) {}
85
86 virtual bool should_disarm_nmethods() const {
87 return false;
88 }
89 };
90
91 class ZRootsIterator {
92 private:
93 const bool _visit_jvmti_weak_export;
94
95 void do_universe(ZRootsIteratorClosure* cl);
96 void do_object_synchronizer(ZRootsIteratorClosure* cl);
97 void do_management(ZRootsIteratorClosure* cl);
98 void do_jvmti_export(ZRootsIteratorClosure* cl);
99 void do_jvmti_weak_export(ZRootsIteratorClosure* cl);
100 void do_system_dictionary(ZRootsIteratorClosure* cl);
101 void do_threads(ZRootsIteratorClosure* cl);
102 void do_code_cache(ZRootsIteratorClosure* cl);
103
104 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_universe> _universe;
105 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_object_synchronizer> _object_synchronizer;
106 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_management> _management;
107 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_jvmti_export> _jvmti_export;
108 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_jvmti_weak_export> _jvmti_weak_export;
109 ZSerialOopsDo<ZRootsIterator, &ZRootsIterator::do_system_dictionary> _system_dictionary;
110 ZParallelOopsDo<ZRootsIterator, &ZRootsIterator::do_threads> _threads;
111 ZParallelOopsDo<ZRootsIterator, &ZRootsIterator::do_code_cache> _code_cache;
112
113 public:
114 ZRootsIterator(bool visit_jvmti_weak_export = false);
115 ~ZRootsIterator();
116
117 void oops_do(ZRootsIteratorClosure* cl);
118 };
119
120 class ZConcurrentRootsIterator {
121 private:
122 ZOopStorageIterator _jni_handles_iter;
123 ZOopStorageIterator _vm_handles_iter;
124 const int _cld_claim;
125
126 void do_jni_handles(ZRootsIteratorClosure* cl);
127 void do_vm_handles(ZRootsIteratorClosure* cl);
128 void do_class_loader_data_graph(ZRootsIteratorClosure* cl);
129
130 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_jni_handles> _jni_handles;
131 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_vm_handles> _vm_handles;
132 ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_class_loader_data_graph> _class_loader_data_graph;
133
134 public:
|