25 #ifndef SHARE_CDS_CDSCONFIG_HPP
26 #define SHARE_CDS_CDSCONFIG_HPP
27
28 #include "memory/allStatic.hpp"
29 #include "utilities/globalDefinitions.hpp"
30 #include "utilities/macros.hpp"
31
32 class JavaThread;
33
34 class CDSConfig : public AllStatic {
35 #if INCLUDE_CDS
36 static bool _is_dumping_static_archive;
37 static bool _is_dumping_preimage_static_archive;
38 static bool _is_dumping_final_static_archive;
39 static bool _is_dumping_dynamic_archive;
40 static bool _is_using_optimized_module_handling;
41 static bool _is_dumping_full_module_graph;
42 static bool _is_using_full_module_graph;
43 static bool _has_aot_linked_classes;
44
45 static char* _default_archive_path;
46 static char* _static_archive_path;
47 static char* _dynamic_archive_path;
48
49 static bool _old_cds_flags_used;
50 static bool _new_aot_flags_used;
51 static bool _disable_heap_dumping;
52
53 static JavaThread* _dumper_thread;
54 #endif
55
56 static void extract_shared_archive_paths(const char* archive_path,
57 char** base_archive_path,
58 char** top_archive_path);
59 static void init_shared_archive_paths();
60
61 static void check_flag_alias(bool alias_is_default, const char* alias_name);
62 static void check_aot_flags();
63 static void check_aotmode_off();
64 static void check_aotmode_auto_or_on();
67
68 public:
69 // Used by jdk.internal.misc.CDS.getCDSConfigStatus();
70 static const int IS_DUMPING_ARCHIVE = 1 << 0;
71 static const int IS_DUMPING_METHOD_HANDLES = 1 << 1;
72 static const int IS_DUMPING_STATIC_ARCHIVE = 1 << 2;
73 static const int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 3;
74 static const int IS_USING_ARCHIVE = 1 << 4;
75
76 static int get_status() NOT_CDS_RETURN_(0);
77
78 // Initialization and command-line checking
79 static void initialize() NOT_CDS_RETURN;
80 static void set_old_cds_flags_used() { CDS_ONLY(_old_cds_flags_used = true); }
81 static bool old_cds_flags_used() { return CDS_ONLY(_old_cds_flags_used) NOT_CDS(false); }
82 static bool new_aot_flags_used() { return CDS_ONLY(_new_aot_flags_used) NOT_CDS(false); }
83 static void check_internal_module_property(const char* key, const char* value) NOT_CDS_RETURN;
84 static void check_incompatible_property(const char* key, const char* value) NOT_CDS_RETURN;
85 static void check_unsupported_dumping_module_options() NOT_CDS_RETURN;
86 static bool has_unsupported_runtime_module_options() NOT_CDS_RETURN_(false);
87 static bool check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line) NOT_CDS_RETURN_(true);
88 static const char* type_of_archive_being_loaded();
89 static const char* type_of_archive_being_written();
90
91 // --- Basic CDS features
92
93 // archive(s) in general
94 static bool is_dumping_archive() { return is_dumping_static_archive() || is_dumping_dynamic_archive(); }
95 static bool is_using_archive() NOT_CDS_RETURN_(false);
96 static int num_archives(const char* archive_path) NOT_CDS_RETURN_(0);
97
98 // static_archive
99 static bool is_dumping_static_archive() { return CDS_ONLY(_is_dumping_static_archive) NOT_CDS(false); }
100 static void enable_dumping_static_archive() { CDS_ONLY(_is_dumping_static_archive = true); }
101
102 // A static CDS archive can be dumped in three modes:
103 //
104 // "classic" - This is the traditional CDS workflow of
105 // "java -Xshare:dump -XX:SharedClassListFile=file.txt".
106 //
107 // "preimage" - This happens when we execute the JEP 483 training run, e.g:
155
156 // --- Archived java objects
157
158 static bool are_vm_options_incompatible_with_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(true);
159 static void log_reasons_for_not_dumping_heap();
160
161 static void disable_heap_dumping() { CDS_ONLY(_disable_heap_dumping = true); }
162 static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
163 static bool is_loading_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
164 static bool is_initing_classes_at_dump_time() NOT_CDS_JAVA_HEAP_RETURN_(false);
165
166 static bool is_dumping_invokedynamic() NOT_CDS_JAVA_HEAP_RETURN_(false);
167 static bool is_dumping_method_handles() NOT_CDS_JAVA_HEAP_RETURN_(false);
168
169 // full_module_graph (requires optimized_module_handling)
170 static bool is_dumping_full_module_graph() { return CDS_ONLY(_is_dumping_full_module_graph) NOT_CDS(false); }
171 static bool is_using_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false);
172 static void stop_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
173 static void stop_using_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
174
175 // Some CDS functions assume that they are called only within a single-threaded context. I.e.,
176 // they are called from:
177 // - The VM thread (e.g., inside VM_PopulateDumpSharedSpace)
178 // - The thread that performs prepatory steps before switching to the VM thread
179 // Since these two threads never execute concurrently, we can avoid using locks in these CDS
180 // function. For safety, these functions should assert with CDSConfig::current_thread_is_vm_or_dumper().
181 class DumperThreadMark {
182 public:
183 DumperThreadMark(JavaThread* current);
184 ~DumperThreadMark();
185 };
186
187 static bool current_thread_is_vm_or_dumper() NOT_CDS_RETURN_(false);
188 };
189
190 #endif // SHARE_CDS_CDSCONFIG_HPP
|
25 #ifndef SHARE_CDS_CDSCONFIG_HPP
26 #define SHARE_CDS_CDSCONFIG_HPP
27
28 #include "memory/allStatic.hpp"
29 #include "utilities/globalDefinitions.hpp"
30 #include "utilities/macros.hpp"
31
32 class JavaThread;
33
34 class CDSConfig : public AllStatic {
35 #if INCLUDE_CDS
36 static bool _is_dumping_static_archive;
37 static bool _is_dumping_preimage_static_archive;
38 static bool _is_dumping_final_static_archive;
39 static bool _is_dumping_dynamic_archive;
40 static bool _is_using_optimized_module_handling;
41 static bool _is_dumping_full_module_graph;
42 static bool _is_using_full_module_graph;
43 static bool _has_aot_linked_classes;
44
45 static bool _module_patching_disables_cds;
46 static bool _java_base_module_patching_disables_cds;
47
48 static char* _default_archive_path;
49 static char* _static_archive_path;
50 static char* _dynamic_archive_path;
51
52 static bool _old_cds_flags_used;
53 static bool _new_aot_flags_used;
54 static bool _disable_heap_dumping;
55
56 static JavaThread* _dumper_thread;
57 #endif
58
59 static void extract_shared_archive_paths(const char* archive_path,
60 char** base_archive_path,
61 char** top_archive_path);
62 static void init_shared_archive_paths();
63
64 static void check_flag_alias(bool alias_is_default, const char* alias_name);
65 static void check_aot_flags();
66 static void check_aotmode_off();
67 static void check_aotmode_auto_or_on();
70
71 public:
72 // Used by jdk.internal.misc.CDS.getCDSConfigStatus();
73 static const int IS_DUMPING_ARCHIVE = 1 << 0;
74 static const int IS_DUMPING_METHOD_HANDLES = 1 << 1;
75 static const int IS_DUMPING_STATIC_ARCHIVE = 1 << 2;
76 static const int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 3;
77 static const int IS_USING_ARCHIVE = 1 << 4;
78
79 static int get_status() NOT_CDS_RETURN_(0);
80
81 // Initialization and command-line checking
82 static void initialize() NOT_CDS_RETURN;
83 static void set_old_cds_flags_used() { CDS_ONLY(_old_cds_flags_used = true); }
84 static bool old_cds_flags_used() { return CDS_ONLY(_old_cds_flags_used) NOT_CDS(false); }
85 static bool new_aot_flags_used() { return CDS_ONLY(_new_aot_flags_used) NOT_CDS(false); }
86 static void check_internal_module_property(const char* key, const char* value) NOT_CDS_RETURN;
87 static void check_incompatible_property(const char* key, const char* value) NOT_CDS_RETURN;
88 static void check_unsupported_dumping_module_options() NOT_CDS_RETURN;
89 static bool has_unsupported_runtime_module_options() NOT_CDS_RETURN_(false);
90 static bool check_vm_args_consistency(bool mode_flag_cmd_line) NOT_CDS_RETURN_(true);
91
92 static bool module_patching_disables_cds() { return _module_patching_disables_cds; }
93 static void set_module_patching_disables_cds() { _module_patching_disables_cds = true; }
94 static bool java_base_module_patching_disables_cds() { return _java_base_module_patching_disables_cds; }
95 static void set_java_base_module_patching_disables_cds() { _java_base_module_patching_disables_cds = true; }
96 static const char* type_of_archive_being_loaded();
97 static const char* type_of_archive_being_written();
98
99 // --- Basic CDS features
100
101 // archive(s) in general
102 static bool is_dumping_archive() { return is_dumping_static_archive() || is_dumping_dynamic_archive(); }
103 static bool is_using_archive() NOT_CDS_RETURN_(false);
104 static int num_archives(const char* archive_path) NOT_CDS_RETURN_(0);
105
106 // static_archive
107 static bool is_dumping_static_archive() { return CDS_ONLY(_is_dumping_static_archive) NOT_CDS(false); }
108 static void enable_dumping_static_archive() { CDS_ONLY(_is_dumping_static_archive = true); }
109
110 // A static CDS archive can be dumped in three modes:
111 //
112 // "classic" - This is the traditional CDS workflow of
113 // "java -Xshare:dump -XX:SharedClassListFile=file.txt".
114 //
115 // "preimage" - This happens when we execute the JEP 483 training run, e.g:
163
164 // --- Archived java objects
165
166 static bool are_vm_options_incompatible_with_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(true);
167 static void log_reasons_for_not_dumping_heap();
168
169 static void disable_heap_dumping() { CDS_ONLY(_disable_heap_dumping = true); }
170 static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
171 static bool is_loading_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
172 static bool is_initing_classes_at_dump_time() NOT_CDS_JAVA_HEAP_RETURN_(false);
173
174 static bool is_dumping_invokedynamic() NOT_CDS_JAVA_HEAP_RETURN_(false);
175 static bool is_dumping_method_handles() NOT_CDS_JAVA_HEAP_RETURN_(false);
176
177 // full_module_graph (requires optimized_module_handling)
178 static bool is_dumping_full_module_graph() { return CDS_ONLY(_is_dumping_full_module_graph) NOT_CDS(false); }
179 static bool is_using_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false);
180 static void stop_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
181 static void stop_using_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
182
183 static bool is_valhalla_preview();
184
185 // Some CDS functions assume that they are called only within a single-threaded context. I.e.,
186 // they are called from:
187 // - The VM thread (e.g., inside VM_PopulateDumpSharedSpace)
188 // - The thread that performs prepatory steps before switching to the VM thread
189 // Since these two threads never execute concurrently, we can avoid using locks in these CDS
190 // function. For safety, these functions should assert with CDSConfig::current_thread_is_vm_or_dumper().
191 class DumperThreadMark {
192 public:
193 DumperThreadMark(JavaThread* current);
194 ~DumperThreadMark();
195 };
196
197 static bool current_thread_is_vm_or_dumper() NOT_CDS_RETURN_(false);
198 };
199
200 #endif // SHARE_CDS_CDSCONFIG_HPP
|