summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriklam <ilam3388@gmail.com>2024-03-01 17:08:46 -0800
committeriklam <ilam3388@gmail.com>2024-03-01 17:08:46 -0800
commit78e828de526da5d497eec3ddde4df3acb211f4a4 (patch)
tree892276a9bd052dd46a19500bc70ba9b76a876ef9
parent8f6edd8dc866bf970b7e7b8358f62832887e6e8b (diff)
8327138: Clean up status management in cdsConfig.hpp and CDS.javapr/18095
-rw-r--r--src/hotspot/share/cds/archiveHeapLoader.cpp4
-rw-r--r--src/hotspot/share/cds/cdsConfig.cpp78
-rw-r--r--src/hotspot/share/cds/cdsConfig.hpp30
-rw-r--r--src/hotspot/share/cds/cdsProtectionDomain.cpp4
-rw-r--r--src/hotspot/share/cds/filemap.cpp8
-rw-r--r--src/hotspot/share/cds/heapShared.cpp4
-rw-r--r--src/hotspot/share/cds/metaspaceShared.cpp9
-rw-r--r--src/hotspot/share/cds/metaspaceShared.hpp7
-rw-r--r--src/hotspot/share/classfile/classLoaderDataShared.cpp12
-rw-r--r--src/hotspot/share/classfile/modules.cpp8
-rw-r--r--src/hotspot/share/classfile/systemDictionary.cpp6
-rw-r--r--src/hotspot/share/include/jvm.h10
-rw-r--r--src/hotspot/share/oops/instanceKlass.cpp4
-rw-r--r--src/hotspot/share/prims/jvm.cpp18
-rw-r--r--src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java4
-rw-r--r--src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java4
-rw-r--r--src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java10
-rw-r--r--src/java.base/share/classes/jdk/internal/misc/CDS.java48
-rw-r--r--src/java.base/share/native/libjava/CDS.c18
19 files changed, 138 insertions, 148 deletions
diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp
index b5af9fec573..535ca9d37a7 100644
--- a/src/hotspot/share/cds/archiveHeapLoader.cpp
+++ b/src/hotspot/share/cds/archiveHeapLoader.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@ void ArchiveHeapLoader::fixup_region() {
fill_failed_loaded_heap();
}
if (is_in_use()) {
- if (!CDSConfig::is_loading_full_module_graph()) {
+ if (!CDSConfig::is_using_full_module_graph()) {
// Need to remove all the archived java.lang.Module objects from HeapShared::roots().
ClassLoaderDataShared::clear_archived_oops();
}
diff --git a/src/hotspot/share/cds/cdsConfig.cpp b/src/hotspot/share/cds/cdsConfig.cpp
index 818b92efe70..23a8f55c276 100644
--- a/src/hotspot/share/cds/cdsConfig.cpp
+++ b/src/hotspot/share/cds/cdsConfig.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,28 +25,36 @@
#include "precompiled.hpp"
#include "cds/archiveHeapLoader.hpp"
#include "cds/cdsConfig.hpp"
+#include "cds/classListWriter.hpp"
#include "cds/heapShared.hpp"
#include "classfile/classLoaderDataShared.hpp"
#include "classfile/moduleEntry.hpp"
#include "include/jvm_io.h"
#include "logging/log.hpp"
+#include "memory/universe.hpp"
#include "runtime/arguments.hpp"
#include "runtime/java.hpp"
#include "utilities/defaultStream.hpp"
bool CDSConfig::_is_dumping_static_archive = false;
bool CDSConfig::_is_dumping_dynamic_archive = false;
-
-// The ability to dump the FMG depends on many factors checked by
-// is_dumping_full_module_graph(), but can be unconditionally disabled by
-// _dumping_full_module_graph_disabled. (Ditto for loading the FMG).
-bool CDSConfig::_dumping_full_module_graph_disabled = false;
-bool CDSConfig::_loading_full_module_graph_disabled = false;
+bool CDSConfig::_is_using_optimized_module_handling = true;
+bool CDSConfig::_is_dumping_full_module_graph = true;
+bool CDSConfig::_is_using_full_module_graph = true;
char* CDSConfig::_default_archive_path = nullptr;
char* CDSConfig::_static_archive_path = nullptr;
char* CDSConfig::_dynamic_archive_path = nullptr;
+int CDSConfig::get_status() {
+ assert(Universe::is_fully_initialized(), "status is finalized only after Universe is initialized");
+ return (is_dumping_archive() ? IS_DUMPING_ARCHIVE : 0) |
+ (is_dumping_static_archive() ? IS_DUMPING_STATIC_ARCHIVE : 0) |
+ (is_logging_lambda_form_invokers() ? IS_LOGGING_LAMBDA_FORM_INVOKERS : 0) |
+ (is_using_archive() ? IS_USING_ARCHIVE : 0);
+}
+
+
void CDSConfig::initialize() {
if (is_dumping_static_archive()) {
if (RequireSharedSpaces) {
@@ -62,6 +70,10 @@ void CDSConfig::initialize() {
if (is_dumping_static_archive() || UseSharedSpaces) {
init_shared_archive_paths();
}
+
+ if (!is_dumping_heap()) {
+ _is_dumping_full_module_graph = false;
+ }
}
char* CDSConfig::default_archive_path() {
@@ -225,14 +237,14 @@ void CDSConfig::init_shared_archive_paths() {
void CDSConfig::check_system_property(const char* key, const char* value) {
if (Arguments::is_internal_module_property(key)) {
- MetaspaceShared::disable_optimized_module_handling();
+ stop_using_optimized_module_handling();
log_info(cds)("optimized module handling: disabled due to incompatible property: %s=%s", key, value);
}
if (strcmp(key, "jdk.module.showModuleResolution") == 0 ||
strcmp(key, "jdk.module.validation") == 0 ||
strcmp(key, "java.system.class.loader") == 0) {
- disable_loading_full_module_graph();
- disable_dumping_full_module_graph();
+ stop_dumping_full_module_graph();
+ stop_using_full_module_graph();
log_info(cds)("full module graph: disabled due to incompatible property: %s=%s", key, value);
}
}
@@ -355,53 +367,59 @@ bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_fl
return true;
}
+bool CDSConfig::is_using_archive() {
+ return UseSharedSpaces; // TODO: UseSharedSpaces will be eventually replaced by CDSConfig::is_using_archive()
+}
+
+bool CDSConfig::is_logging_lambda_form_invokers() {
+ return ClassListWriter::is_enabled() || is_dumping_dynamic_archive();
+}
+
+void CDSConfig::stop_using_optimized_module_handling() {
+ _is_using_optimized_module_handling = false;
+ _is_dumping_full_module_graph = false; // This requires is_using_optimized_module_handling()
+ _is_using_full_module_graph = false; // This requires is_using_optimized_module_handling()
+}
+
#if INCLUDE_CDS_JAVA_HEAP
bool CDSConfig::is_dumping_heap() {
// heap dump is not supported in dynamic dump
return is_dumping_static_archive() && HeapShared::can_write();
}
-bool CDSConfig::is_dumping_full_module_graph() {
- if (!_dumping_full_module_graph_disabled &&
- is_dumping_heap() &&
- MetaspaceShared::use_optimized_module_handling()) {
+bool CDSConfig::is_using_full_module_graph() {
+ if (ClassLoaderDataShared::is_full_module_graph_loaded()) {
return true;
- } else {
- return false;
}
-}
-bool CDSConfig::is_loading_full_module_graph() {
- if (ClassLoaderDataShared::is_full_module_graph_loaded()) {
- return true;
+ if (!_is_using_full_module_graph) {
+ return false;
}
- if (!_loading_full_module_graph_disabled &&
- UseSharedSpaces &&
- ArchiveHeapLoader::can_use() &&
- MetaspaceShared::use_optimized_module_handling()) {
+ if (UseSharedSpaces && ArchiveHeapLoader::can_use()) {
// Classes used by the archived full module graph are loaded in JVMTI early phase.
assert(!(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env()),
"CDS should be disabled if early class hooks are enabled");
return true;
} else {
+ _is_using_full_module_graph = false;
return false;
}
}
-void CDSConfig::disable_dumping_full_module_graph(const char* reason) {
- if (!_dumping_full_module_graph_disabled) {
- _dumping_full_module_graph_disabled = true;
+void CDSConfig::stop_dumping_full_module_graph(const char* reason) {
+ if (_is_dumping_full_module_graph) {
+ _is_dumping_full_module_graph = false;
if (reason != nullptr) {
log_info(cds)("full module graph cannot be dumped: %s", reason);
}
}
}
-void CDSConfig::disable_loading_full_module_graph(const char* reason) {
+void CDSConfig::stop_using_full_module_graph(const char* reason) {
assert(!ClassLoaderDataShared::is_full_module_graph_loaded(), "you call this function too late!");
- if (!_loading_full_module_graph_disabled) {
- _loading_full_module_graph_disabled = true;
+ if (_is_using_full_module_graph) {
+ _is_using_full_module_graph = false;
if (reason != nullptr) {
log_info(cds)("full module graph cannot be loaded: %s", reason);
}
diff --git a/src/hotspot/share/cds/cdsConfig.hpp b/src/hotspot/share/cds/cdsConfig.hpp
index ec5352b3703..ef3a525fa89 100644
--- a/src/hotspot/share/cds/cdsConfig.hpp
+++ b/src/hotspot/share/cds/cdsConfig.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,8 +33,9 @@ class CDSConfig : public AllStatic {
#if INCLUDE_CDS
static bool _is_dumping_static_archive;
static bool _is_dumping_dynamic_archive;
- static bool _dumping_full_module_graph_disabled;
- static bool _loading_full_module_graph_disabled;
+ static bool _is_using_optimized_module_handling;
+ static bool _is_dumping_full_module_graph;
+ static bool _is_using_full_module_graph;
static char* _default_archive_path;
static char* _static_archive_path;
@@ -48,6 +49,13 @@ class CDSConfig : public AllStatic {
static bool check_unsupported_cds_runtime_properties();
public:
+ // Used by jdk.internal.misc.CDS.getCDSConfigStatus();
+ static const int IS_DUMPING_ARCHIVE = 1 << 0;
+ static const int IS_DUMPING_STATIC_ARCHIVE = 1 << 1;
+ static const int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 2;
+ static const int IS_USING_ARCHIVE = 1 << 3;
+ static int get_status() NOT_CDS_RETURN_(0);
+
// Initialization and command-line checking
static void initialize() NOT_CDS_RETURN;
static void check_system_property(const char* key, const char* value) NOT_CDS_RETURN;
@@ -61,6 +69,7 @@ public:
static bool is_dumping_dynamic_archive() { return CDS_ONLY(_is_dumping_dynamic_archive) NOT_CDS(false); }
static void enable_dumping_dynamic_archive() { CDS_ONLY(_is_dumping_dynamic_archive = true); }
static void disable_dumping_dynamic_archive() { CDS_ONLY(_is_dumping_dynamic_archive = false); }
+ static bool is_using_archive() NOT_CDS_RETURN_(false);
// Archive paths
// Points to the classes.jsa in $JAVA_HOME
@@ -71,15 +80,18 @@ public:
static const char* dynamic_archive_path() { return CDS_ONLY(_dynamic_archive_path) NOT_CDS(nullptr); }
static int num_archives(const char* archive_path) NOT_CDS_RETURN_(0);
+ static bool is_logging_lambda_form_invokers() NOT_CDS_RETURN_(false);
+ // Can we skip some expensive operations related to modules?
+ static bool is_using_optimized_module_handling() { return CDS_ONLY(_is_using_optimized_module_handling) NOT_CDS(false); }
+ static void stop_using_optimized_module_handling() NOT_CDS_RETURN;
// CDS archived heap
- static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
- static void disable_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
- static bool is_dumping_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false);
- static void disable_loading_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
- static bool is_loading_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false);
-
+ static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
+ static void stop_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
+ static bool is_dumping_full_module_graph() { return CDS_ONLY(_is_dumping_full_module_graph) NOT_CDS(false); }
+ static void stop_using_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN;
+ static bool is_using_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false);
};
#endif // SHARE_CDS_CDSCONFIG_HPP
diff --git a/src/hotspot/share/cds/cdsProtectionDomain.cpp b/src/hotspot/share/cds/cdsProtectionDomain.cpp
index 70ce4fb3b96..a4ffeea26dc 100644
--- a/src/hotspot/share/cds/cdsProtectionDomain.cpp
+++ b/src/hotspot/share/cds/cdsProtectionDomain.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -119,7 +119,7 @@ Handle CDSProtectionDomain::get_package_name(Symbol* class_name, TRAPS) {
PackageEntry* CDSProtectionDomain::get_package_entry_from_class(InstanceKlass* ik, Handle class_loader) {
PackageEntry* pkg_entry = ik->package();
- if (CDSConfig::is_loading_full_module_graph() && ik->is_shared() && pkg_entry != nullptr) {
+ if (CDSConfig::is_using_full_module_graph() && ik->is_shared() && pkg_entry != nullptr) {
assert(MetaspaceShared::is_in_shared_metaspace(pkg_entry), "must be");
assert(!ik->is_shared_unregistered_class(), "unexpected archived package entry for an unregistered class");
assert(ik->module()->is_named(), "unexpected archived package entry for a class in an unnamed module");
diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp
index 4c3b9fe018e..7b9dbd80a68 100644
--- a/src/hotspot/share/cds/filemap.cpp
+++ b/src/hotspot/share/cds/filemap.cpp
@@ -212,7 +212,7 @@ void FileMapHeader::populate(FileMapInfo *info, size_t core_region_alignment,
_compressed_oops = UseCompressedOops;
_compressed_class_ptrs = UseCompressedClassPointers;
_max_heap_size = MaxHeapSize;
- _use_optimized_module_handling = MetaspaceShared::use_optimized_module_handling();
+ _use_optimized_module_handling = CDSConfig::is_using_optimized_module_handling();
_has_full_module_graph = CDSConfig::is_dumping_full_module_graph();
// The following fields are for sanity checks for whether this archive
@@ -1977,7 +1977,7 @@ void FileMapInfo::map_or_load_heap_region() {
}
if (!success) {
- CDSConfig::disable_loading_full_module_graph();
+ CDSConfig::stop_using_full_module_graph();
}
}
@@ -2393,13 +2393,13 @@ bool FileMapHeader::validate() {
}
if (!_use_optimized_module_handling) {
- MetaspaceShared::disable_optimized_module_handling();
+ CDSConfig::stop_using_optimized_module_handling();
log_info(cds)("optimized module handling: disabled because archive was created without optimized module handling");
}
if (is_static() && !_has_full_module_graph) {
// Only the static archive can contain the full module graph.
- CDSConfig::disable_loading_full_module_graph("archive was created without full module graph");
+ CDSConfig::stop_using_full_module_graph("archive was created without full module graph");
}
return true;
diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp
index 0225977e874..5160228b27c 100644
--- a/src/hotspot/share/cds/heapShared.cpp
+++ b/src/hotspot/share/cds/heapShared.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -972,7 +972,7 @@ HeapShared::resolve_or_init_classes_for_subgraph_of(Klass* k, bool do_init, TRAP
}
return nullptr;
} else {
- if (record->is_full_module_graph() && !CDSConfig::is_loading_full_module_graph()) {
+ if (record->is_full_module_graph() && !CDSConfig::is_using_full_module_graph()) {
if (log_is_enabled(Info, cds, heap)) {
ResourceMark rm(THREAD);
log_info(cds, heap)("subgraph %s cannot be used because full module graph is disabled",
diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp
index ae5d92fedff..ca745671e40 100644
--- a/src/hotspot/share/cds/metaspaceShared.cpp
+++ b/src/hotspot/share/cds/metaspaceShared.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -96,7 +96,6 @@ bool MetaspaceShared::_remapped_readwrite = false;
void* MetaspaceShared::_shared_metaspace_static_top = nullptr;
intx MetaspaceShared::_relocation_delta;
char* MetaspaceShared::_requested_base_address;
-bool MetaspaceShared::_use_optimized_module_handling = true;
// The CDS archive is divided into the following regions:
// rw - read-write metadata
@@ -784,7 +783,7 @@ void MetaspaceShared::preload_and_dump_impl(TRAPS) {
if (CDSConfig::is_dumping_heap()) {
if (!HeapShared::is_archived_boot_layer_available(THREAD)) {
log_info(cds)("archivedBootLayer not available, disabling full module graph");
- CDSConfig::disable_dumping_full_module_graph();
+ CDSConfig::stop_dumping_full_module_graph();
}
HeapShared::init_for_dumping(CHECK);
ArchiveHeapWriter::init();
@@ -1176,8 +1175,8 @@ MapArchiveResult MetaspaceShared::map_archives(FileMapInfo* static_mapinfo, File
static_mapinfo->map_or_load_heap_region();
}
#endif // _LP64
- log_info(cds)("initial optimized module handling: %s", MetaspaceShared::use_optimized_module_handling() ? "enabled" : "disabled");
- log_info(cds)("initial full module graph: %s", CDSConfig::is_loading_full_module_graph() ? "enabled" : "disabled");
+ log_info(cds)("initial optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled");
+ log_info(cds)("initial full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled");
} else {
unmap_archive(static_mapinfo);
unmap_archive(dynamic_mapinfo);
diff --git a/src/hotspot/share/cds/metaspaceShared.hpp b/src/hotspot/share/cds/metaspaceShared.hpp
index 737340788f1..89188a12dce 100644
--- a/src/hotspot/share/cds/metaspaceShared.hpp
+++ b/src/hotspot/share/cds/metaspaceShared.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -52,7 +52,6 @@ class MetaspaceShared : AllStatic {
static void* _shared_metaspace_static_top;
static intx _relocation_delta;
static char* _requested_base_address;
- static bool _use_optimized_module_handling;
public:
enum {
// core archive spaces
@@ -159,10 +158,6 @@ public:
return is_windows;
}
- // Can we skip some expensive operations related to modules?
- static bool use_optimized_module_handling() { return NOT_CDS(false) CDS_ONLY(_use_optimized_module_handling); }
- static void disable_optimized_module_handling() { _use_optimized_module_handling = false; }
-
private:
static void read_extra_data(JavaThread* current, const char* filename) NOT_CDS_RETURN;
static FileMapInfo* open_static_archive();
diff --git a/src/hotspot/share/classfile/classLoaderDataShared.cpp b/src/hotspot/share/classfile/classLoaderDataShared.cpp
index e6f34b2b8b9..b6d93eace4e 100644
--- a/src/hotspot/share/classfile/classLoaderDataShared.cpp
+++ b/src/hotspot/share/classfile/classLoaderDataShared.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -172,7 +172,7 @@ void ClassLoaderDataShared::serialize(SerializeClosure* f) {
_archived_system_loader_data.serialize(f);
f->do_ptr(&_archived_javabase_moduleEntry);
- if (f->reading() && CDSConfig::is_loading_full_module_graph()) {
+ if (f->reading() && CDSConfig::is_using_full_module_graph()) {
// Must be done before ClassLoader::create_javabase()
_archived_boot_loader_data.restore(null_class_loader_data(), true, false);
ModuleEntryTable::set_javabase_moduleEntry(_archived_javabase_moduleEntry);
@@ -182,25 +182,25 @@ void ClassLoaderDataShared::serialize(SerializeClosure* f) {
}
void ClassLoaderDataShared::clear_archived_oops() {
- assert(!CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(!CDSConfig::is_using_full_module_graph(), "must be");
_archived_boot_loader_data.clear_archived_oops();
_archived_platform_loader_data.clear_archived_oops();
_archived_system_loader_data.clear_archived_oops();
}
oop ClassLoaderDataShared::restore_archived_oops_for_null_class_loader_data() {
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
_archived_boot_loader_data.restore(null_class_loader_data(), false, true);
return _archived_javabase_moduleEntry->module();
}
void ClassLoaderDataShared::restore_java_platform_loader_from_archive(ClassLoaderData* loader_data) {
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
_archived_platform_loader_data.restore(loader_data, true, true);
}
void ClassLoaderDataShared::restore_java_system_loader_from_archive(ClassLoaderData* loader_data) {
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
_archived_system_loader_data.restore(loader_data, true, true);
_full_module_graph_loaded = true;
}
diff --git a/src/hotspot/share/classfile/modules.cpp b/src/hotspot/share/classfile/modules.cpp
index 4664d9565d3..d4f3cc29962 100644
--- a/src/hotspot/share/classfile/modules.cpp
+++ b/src/hotspot/share/classfile/modules.cpp
@@ -596,15 +596,15 @@ void Modules::serialize(SerializeClosure* soc) {
if (disable) {
log_info(cds)("Disabling optimized module handling");
- MetaspaceShared::disable_optimized_module_handling();
+ CDSConfig::stop_using_optimized_module_handling();
}
- log_info(cds)("optimized module handling: %s", MetaspaceShared::use_optimized_module_handling() ? "enabled" : "disabled");
- log_info(cds)("full module graph: %s", CDSConfig::is_loading_full_module_graph() ? "enabled" : "disabled");
+ log_info(cds)("optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled");
+ log_info(cds)("full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled");
}
}
void Modules::define_archived_modules(Handle h_platform_loader, Handle h_system_loader, TRAPS) {
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
// We don't want the classes used by the archived full module graph to be redefined by JVMTI.
// Luckily, such classes are loaded in the JVMTI "early" phase, and CDS is disabled if a JVMTI
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index 30538926b41..062e53ae114 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -140,7 +140,7 @@ void SystemDictionary::compute_java_loaders(TRAPS) {
} else {
// It must have been restored from the archived module graph
assert(UseSharedSpaces, "must be");
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
DEBUG_ONLY(
oop system_loader = get_system_class_loader_impl(CHECK);
assert(_java_system_loader.resolve() == system_loader, "must be");
@@ -153,7 +153,7 @@ void SystemDictionary::compute_java_loaders(TRAPS) {
} else {
// It must have been restored from the archived module graph
assert(UseSharedSpaces, "must be");
- assert(CDSConfig::is_loading_full_module_graph(), "must be");
+ assert(CDSConfig::is_using_full_module_graph(), "must be");
DEBUG_ONLY(
oop platform_loader = get_platform_class_loader_impl(CHECK);
assert(_java_platform_loader.resolve() == platform_loader, "must be");
@@ -965,7 +965,7 @@ bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
// (2) Check if we are loading into the same module from the same location as in dump time.
- if (MetaspaceShared::use_optimized_module_handling()) {
+ if (CDSConfig::is_using_optimized_module_handling()) {
// Class visibility has not changed between dump time and run time, so a class
// that was visible (and thus archived) during dump time is always visible during runtime.
assert(SystemDictionary::is_shared_class_visible_impl(class_name, ik, pkg_entry, class_loader),
diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h
index b49c15d73b6..99cdac3aec5 100644
--- a/src/hotspot/share/include/jvm.h
+++ b/src/hotspot/share/include/jvm.h
@@ -197,14 +197,8 @@ JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env, jclass caller,
jobject implementationMember,
jobject dynamicMethodType);
-JNIEXPORT jboolean JNICALL
-JVM_IsCDSDumpingEnabled(JNIEnv* env);
-
-JNIEXPORT jboolean JNICALL
-JVM_IsSharingEnabled(JNIEnv* env);
-
-JNIEXPORT jboolean JNICALL
-JVM_IsDumpingClassList(JNIEnv* env);
+JNIEXPORT jint JNICALL
+JVM_GetCDSConfigStatus();
JNIEXPORT jlong JNICALL
JVM_GetRandomSeedForDumping();
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index e236e583d24..53f3bfdd129 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -2705,7 +2705,7 @@ void InstanceKlass::init_shared_package_entry() {
_package_entry = PackageEntry::get_archived_entry(_package_entry);
}
} else if (CDSConfig::is_dumping_dynamic_archive() &&
- CDSConfig::is_loading_full_module_graph() &&
+ CDSConfig::is_using_full_module_graph() &&
MetaspaceShared::is_in_shared_metaspace(_package_entry)) {
// _package_entry is an archived package in the base archive. Leave it as is.
} else {
@@ -3031,7 +3031,7 @@ void InstanceKlass::set_package(ClassLoaderData* loader_data, PackageEntry* pkg_
}
if (is_shared() && _package_entry != nullptr) {
- if (CDSConfig::is_loading_full_module_graph() && _package_entry == pkg_entry) {
+ if (CDSConfig::is_using_full_module_graph() && _package_entry == pkg_entry) {
// we can use the saved package
assert(MetaspaceShared::is_in_shared_metaspace(_package_entry), "must be");
return;
diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
index 4ec0dfa34cc..500036febab 100644
--- a/src/hotspot/share/prims/jvm.cpp
+++ b/src/hotspot/share/prims/jvm.cpp
@@ -3688,14 +3688,6 @@ JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
#endif // INCLUDE_CDS
JVM_END
-JVM_LEAF(jboolean, JVM_IsCDSDumpingEnabled(JNIEnv* env))
- return CDSConfig::is_dumping_archive();
-JVM_END
-
-JVM_LEAF(jboolean, JVM_IsSharingEnabled(JNIEnv* env))
- return UseSharedSpaces;
-JVM_END
-
JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping())
if (CDSConfig::is_dumping_static_archive()) {
// We do this so that the default CDS archive can be deterministic.
@@ -3719,17 +3711,13 @@ JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping())
}
JVM_END
-JVM_LEAF(jboolean, JVM_IsDumpingClassList(JNIEnv *env))
-#if INCLUDE_CDS
- return ClassListWriter::is_enabled() || CDSConfig::is_dumping_dynamic_archive();
-#else
- return false;
-#endif // INCLUDE_CDS
+JVM_ENTRY_NO_ENV(jint, JVM_GetCDSConfigStatus())
+ return CDSConfig::get_status();
JVM_END
JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line))
#if INCLUDE_CDS
- assert(ClassListWriter::is_enabled() || CDSConfig::is_dumping_dynamic_archive(), "Should be set and open or do dynamic dump");
+ assert(CDSConfig::is_logging_lambda_form_invokers(), "sanity");
if (line != nullptr) {
ResourceMark rm(THREAD);
Handle h_line (THREAD, JNIHandles::resolve_non_null(line));
diff --git a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
index 593c66fab70..83b2b21562e 100644
--- a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
+++ b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -255,7 +255,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
private Class<?> spinInnerClass() throws LambdaConversionException {
// CDS does not handle disableEagerInitialization or useImplMethodHandle
if (!disableEagerInitialization && !useImplMethodHandle) {
- if (CDS.isSharingEnabled()) {
+ if (CDS.isUsingArchive()) {
// load from CDS archive if present
Class<?> innerClass = LambdaProxyClassArchive.find(targetClass,
interfaceMethodName,
diff --git a/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java b/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java
index ef79f4d473c..4d14848043a 100644
--- a/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java
+++ b/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -102,7 +102,7 @@ final class LambdaProxyClassArchive {
Class<?>[] altInterfaces,
MethodType[] altMethods) {
if (!loadedByBuiltinLoader(caller) ||
- !CDS.isSharingEnabled() || isSerializable || altInterfaces.length > 0 || altMethods.length > 0)
+ !CDS.isUsingArchive() || isSerializable || altInterfaces.length > 0 || altMethods.length > 0)
return null;
return findFromArchive(caller, interfaceMethodName, factoryType, interfaceMethodType,
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java
index 0191306881b..7d87d4f79a8 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -134,8 +134,8 @@ class MethodHandleStatics {
shortenSignature(basicTypeSignature(type)) +
(resolvedMember != null ? " (success)" : " (fail)"));
}
- if (CDS.isDumpingClassList()) {
- CDS.traceLambdaFormInvoker("[LF_RESOLVE]", holder.getName(), name, shortenSignature(basicTypeSignature(type)));
+ if (CDS.isLoggingLambdaFormInvokers()) {
+ CDS.logLambdaFormInvoker("[LF_RESOLVE]", holder.getName(), name, shortenSignature(basicTypeSignature(type)));
}
}
@@ -148,8 +148,8 @@ class MethodHandleStatics {
if (TRACE_RESOLVE) {
System.out.println("[SPECIES_RESOLVE] " + cn + (salvage != null ? " (salvaged)" : " (generated)"));
}
- if (CDS.isDumpingClassList()) {
- CDS.traceSpeciesType("[SPECIES_RESOLVE]", cn);
+ if (CDS.isLoggingLambdaFormInvokers()) {
+ CDS.logSpeciesType("[SPECIES_RESOLVE]", cn);
}
}
// handy shared exception makers (they simplify the common case code)
diff --git a/src/java.base/share/classes/jdk/internal/misc/CDS.java b/src/java.base/share/classes/jdk/internal/misc/CDS.java
index e3365441548..ef75326ec58 100644
--- a/src/java.base/share/classes/jdk/internal/misc/CDS.java
+++ b/src/java.base/share/classes/jdk/internal/misc/CDS.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,48 +41,42 @@ import java.util.stream.Stream;
import jdk.internal.access.SharedSecrets;
public class CDS {
- private static final boolean isDumpingClassList;
- private static final boolean isDumpingArchive;
- private static final boolean isSharingEnabled;
- private static final boolean isDumpingStaticArchive;
- static {
- isDumpingClassList = isDumpingClassList0();
- isDumpingArchive = isDumpingArchive0();
- isSharingEnabled = isSharingEnabled0();
- isDumpingStaticArchive = isDumpingArchive && !isSharingEnabled;
- }
+ // Must be in sync with cdsConfig.hpp
+ private static final int IS_DUMPING_ARCHIVE = 1 << 0;
+ private static final int IS_DUMPING_STATIC_ARCHIVE = 1 << 1;
+ private static final int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 2;
+ private static final int IS_USING_ARCHIVE = 1 << 3;
+ private static final int configStatus = getCDSConfigStatus();
/**
- * indicator for dumping class list.
- */
- public static boolean isDumpingClassList() {
- return isDumpingClassList;
+ * Should we log the use of lambda form invokers?
+ */
+ public static boolean isLoggingLambdaFormInvokers() {
+ return (configStatus & IS_LOGGING_LAMBDA_FORM_INVOKERS) != 0;
}
/**
* Is the VM writing to a (static or dynamic) CDS archive.
*/
public static boolean isDumpingArchive() {
- return isDumpingArchive;
+ return (configStatus & IS_DUMPING_ARCHIVE) != 0;
}
/**
- * Is sharing enabled.
+ * Is the VM using at least one CDS archive?
*/
- public static boolean isSharingEnabled() {
- return isSharingEnabled;
+ public static boolean isUsingArchive() {
+ return (configStatus & IS_USING_ARCHIVE) != 0;
}
/**
* Is dumping static archive.
*/
public static boolean isDumpingStaticArchive() {
- return isDumpingStaticArchive;
+ return (configStatus & IS_DUMPING_STATIC_ARCHIVE) != 0;
}
- private static native boolean isDumpingClassList0();
- private static native boolean isDumpingArchive0();
- private static native boolean isSharingEnabled0();
+ private static native int getCDSConfigStatus();
private static native void logLambdaFormInvoker(String line);
/**
@@ -112,8 +106,8 @@ public class CDS {
/**
* log lambda form invoker holder, name and method type
*/
- public static void traceLambdaFormInvoker(String prefix, String holder, String name, String type) {
- if (isDumpingClassList) {
+ public static void logLambdaFormInvoker(String prefix, String holder, String name, String type) {
+ if (isLoggingLambdaFormInvokers()) {
logLambdaFormInvoker(prefix + " " + holder + " " + name + " " + type);
}
}
@@ -121,8 +115,8 @@ public class CDS {
/**
* log species
*/
- public static void traceSpeciesType(String prefix, String cn) {
- if (isDumpingClassList) {
+ public static void logSpeciesType(String prefix, String cn) {
+ if (isLoggingLambdaFormInvokers()) {
logLambdaFormInvoker(prefix + " " + cn);
}
}
diff --git a/src/java.base/share/native/libjava/CDS.c b/src/java.base/share/native/libjava/CDS.c
index 77f0020db38..989b5aa9dbf 100644
--- a/src/java.base/share/native/libjava/CDS.c
+++ b/src/java.base/share/native/libjava/CDS.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,19 +44,9 @@ Java_jdk_internal_misc_CDS_getRandomSeedForDumping(JNIEnv *env, jclass ignore) {
return JVM_GetRandomSeedForDumping();
}
-JNIEXPORT jboolean JNICALL
-Java_jdk_internal_misc_CDS_isDumpingArchive0(JNIEnv *env, jclass jcls) {
- return JVM_IsCDSDumpingEnabled(env);
-}
-
-JNIEXPORT jboolean JNICALL
-Java_jdk_internal_misc_CDS_isSharingEnabled0(JNIEnv *env, jclass jcls) {
- return JVM_IsSharingEnabled(env);
-}
-
-JNIEXPORT jboolean JNICALL
-Java_jdk_internal_misc_CDS_isDumpingClassList0(JNIEnv *env, jclass jcls) {
- return JVM_IsDumpingClassList(env);
+JNIEXPORT jint JNICALL
+Java_jdk_internal_misc_CDS_getCDSConfigStatus(JNIEnv *env, jclass jcls) {
+ return JVM_GetCDSConfigStatus();
}
JNIEXPORT void JNICALL