From 548d552bc10a3031fc85724ef561d17878dda5b1 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Fri, 10 Mar 2023 16:30:48 +0000 Subject: [PATCH] 8303548: Arguments::get_default_shared_archive_path() should cache the result for future use Reviewed-by: ccheung, dholmes --- src/hotspot/share/cds/filemap.cpp | 1 - src/hotspot/share/runtime/arguments.cpp | 34 ++++++++++++------------- src/hotspot/share/runtime/arguments.hpp | 1 + 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index b05a6f7a34a..49fa58a70cb 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -191,7 +191,6 @@ void FileMapInfo::populate_header(size_t core_region_alignment) { header_size += base_archive_name_size; base_archive_name_offset = c_header_size; } - FREE_C_HEAP_ARRAY(const char, default_base_archive_name); } ResourceMark rm; GrowableArray* app_cp_array = create_dumptime_app_classpath_array(); diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index ee80c5f0fa7..59c8de71a65 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -96,6 +96,7 @@ size_t Arguments::_default_SharedBaseAddress = SharedBaseAddress; bool Arguments::_enable_preview = false; +char* Arguments::_default_shared_archive_path = nullptr; char* Arguments::SharedArchivePath = nullptr; char* Arguments::SharedDynamicArchivePath = nullptr; @@ -3410,19 +3411,20 @@ void Arguments::set_shared_spaces_flags_and_archive_paths() { // Sharing support // Construct the path to the archive char* Arguments::get_default_shared_archive_path() { - char *default_archive_path; - char jvm_path[JVM_MAXPATHLEN]; - os::jvm_path(jvm_path, sizeof(jvm_path)); - char *end = strrchr(jvm_path, *os::file_separator()); - if (end != nullptr) *end = '\0'; - size_t jvm_path_len = strlen(jvm_path); - size_t file_sep_len = strlen(os::file_separator()); - const size_t len = jvm_path_len + file_sep_len + 20; - default_archive_path = NEW_C_HEAP_ARRAY(char, len, mtArguments); - jio_snprintf(default_archive_path, len, - LP64_ONLY(!UseCompressedOops ? "%s%sclasses_nocoops.jsa":) "%s%sclasses.jsa", - jvm_path, os::file_separator()); - return default_archive_path; + if (_default_shared_archive_path == nullptr) { + char jvm_path[JVM_MAXPATHLEN]; + os::jvm_path(jvm_path, sizeof(jvm_path)); + char *end = strrchr(jvm_path, *os::file_separator()); + if (end != nullptr) *end = '\0'; + size_t jvm_path_len = strlen(jvm_path); + size_t file_sep_len = strlen(os::file_separator()); + const size_t len = jvm_path_len + file_sep_len + 20; + _default_shared_archive_path = NEW_C_HEAP_ARRAY(char, len, mtArguments); + jio_snprintf(_default_shared_archive_path, len, + LP64_ONLY(!UseCompressedOops ? "%s%sclasses_nocoops.jsa":) "%s%sclasses.jsa", + jvm_path, os::file_separator()); + } + return _default_shared_archive_path; } int Arguments::num_archives(const char* archive_path) { @@ -3474,12 +3476,10 @@ void Arguments::init_shared_archive_paths() { } check_unsupported_dumping_properties(); - char* shared_archive_path = get_default_shared_archive_path(); - if (os::same_files(shared_archive_path, ArchiveClassesAtExit)) { + if (os::same_files(get_default_shared_archive_path(), ArchiveClassesAtExit)) { vm_exit_during_initialization( - "Cannot specify the default CDS archive for -XX:ArchiveClassesAtExit", shared_archive_path); + "Cannot specify the default CDS archive for -XX:ArchiveClassesAtExit", get_default_shared_archive_path()); } - FREE_C_HEAP_ARRAY(char, shared_archive_path); } if (SharedArchiveFile == nullptr) { diff --git a/src/hotspot/share/runtime/arguments.hpp b/src/hotspot/share/runtime/arguments.hpp index d4dc4b9ab84..cdde10242cf 100644 --- a/src/hotspot/share/runtime/arguments.hpp +++ b/src/hotspot/share/runtime/arguments.hpp @@ -470,6 +470,7 @@ class Arguments : AllStatic { // Return nullptr if the arg has expired. static const char* handle_aliases_and_deprecation(const char* arg); + static char* _default_shared_archive_path; static char* SharedArchivePath; static char* SharedDynamicArchivePath; static size_t _default_SharedBaseAddress; // The default value specified in globals.hpp