1
2 /*
3 * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26 #ifndef SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
27 #define SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
28
29 #include "cds/dumpTimeClassInfo.hpp"
30
31 #include "classfile/systemDictionaryShared.hpp"
32 #include "classfile/classLoaderData.inline.hpp"
33 #include "oops/instanceKlass.hpp"
34 #include "oops/klass.inline.hpp"
35 #include "runtime/safepoint.hpp"
36
37 #if INCLUDE_CDS
38
39 // For safety, only iterate over a class if its loader is alive.
40 // This function must be called only inside a safepoint, where the value of
41 // k->is_loader_alive() will not change.
42 template<typename Function>
43 void DumpTimeSharedClassTable::iterate_all_live_classes(Function function) const {
44 auto wrapper = [&] (InstanceKlass* k, DumpTimeClassInfo& info) {
45 assert(SafepointSynchronize::is_at_safepoint(), "invariant");
46 assert_lock_strong(DumpTimeTable_lock);
47 if (k->is_loader_alive()) {
48 function(k, info);
49 assert(k->is_loader_alive(), "must not change");
50 } else {
51 if (!SystemDictionaryShared::is_excluded_class(k)) {
52 SystemDictionaryShared::warn_excluded(k, "Class loader not alive");
53 SystemDictionaryShared::set_excluded_locked(k);
54 }
55 }
56 };
57 DumpTimeSharedClassTableBaseType::iterate_all(wrapper);
58 }
59
60
61 template<class ITER>
62 void DumpTimeSharedClassTable::iterate_all_live_classes(ITER* iter) const {
63 auto function = [&] (InstanceKlass* k, DumpTimeClassInfo& v) {
64 iter->do_entry(k, v);
65 };
66 iterate_all_live_classes(function);
67 }
68
69 #endif // INCLUDE_CDS
70
71 #endif // SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
|
1
2 /*
3 * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26 #ifndef SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
27 #define SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
28
29 #include "cds/dumpTimeClassInfo.hpp"
30
31 #include "cds/cdsConfig.hpp"
32 #include "classfile/systemDictionaryShared.hpp"
33 #include "classfile/classLoaderData.inline.hpp"
34 #include "oops/instanceKlass.hpp"
35 #include "oops/klass.inline.hpp"
36 #include "runtime/safepoint.hpp"
37
38 #if INCLUDE_CDS
39
40 // For safety, only iterate over a class if its loader is alive.
41 // This function must be called only inside a safepoint, where the value of
42 // k->is_loader_alive() will not change.
43 template<typename Function>
44 void DumpTimeSharedClassTable::iterate_all_live_classes(Function function) const {
45 auto wrapper = [&] (InstanceKlass* k, DumpTimeClassInfo& info) {
46 assert(SafepointSynchronize::is_at_safepoint(), "invariant");
47 assert_lock_strong(DumpTimeTable_lock);
48 if (CDSConfig::is_dumping_final_static_archive() && !k->is_loaded()) {
49 assert(k->is_shared_unregistered_class(), "must be");
50 function(k, info);
51 } else if (k->is_loader_alive()) {
52 function(k, info);
53 assert(k->is_loader_alive(), "must not change");
54 } else {
55 if (!SystemDictionaryShared::is_excluded_class(k)) {
56 SystemDictionaryShared::warn_excluded(k, "Class loader not alive");
57 SystemDictionaryShared::set_excluded_locked(k);
58 }
59 }
60 };
61 DumpTimeSharedClassTableBaseType::iterate_all(wrapper);
62 }
63
64 template<typename Function>
65 void DumpTimeSharedClassTable::iterate_all_classes_in_builtin_loaders(Function function) const {
66 auto wrapper = [&] (InstanceKlass* k, DumpTimeClassInfo& info) {
67 assert_lock_strong(DumpTimeTable_lock);
68 // k->class_loader_data() could be null for unreg classes loaded during CDSConfig::is_dumping_final_static_archive()
69 if (k->class_loader_data() != nullptr && SystemDictionaryShared::is_builtin_loader(k->class_loader_data())) {
70 assert(k->is_loader_alive(), "must be");
71 function(k, info);
72 assert(k->is_loader_alive(), "must be");
73 }
74 };
75 DumpTimeSharedClassTableBaseType::iterate_all(wrapper);
76 }
77
78
79 template<class ITER>
80 void DumpTimeSharedClassTable::iterate_all_live_classes(ITER* iter) const {
81 auto function = [&] (InstanceKlass* k, DumpTimeClassInfo& v) {
82 iter->do_entry(k, v);
83 };
84 iterate_all_live_classes(function);
85 }
86
87 #endif // INCLUDE_CDS
88
89 #endif // SHARE_CDS_DUMPTIMECLASSINFO_INLINE_HPP
|