< prev index next > src/hotspot/share/classfile/moduleEntry.cpp
Print this page
#include "classfile/classLoader.hpp"
#include "classfile/classLoaderData.inline.hpp"
#include "classfile/classLoaderDataShared.hpp"
#include "classfile/javaClasses.inline.hpp"
#include "classfile/moduleEntry.hpp"
+ #include "classfile/modules.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/systemDictionaryShared.hpp"
#include "jni.h"
#include "logging/log.hpp"
#include "logging/logStream.hpp"
_loader_data = cld;
}
void ModuleEntry::metaspace_pointers_do(MetaspaceClosure* it) {
it->push(&_name);
! it->push(&_reads);
it->push(&_version);
it->push(&_location);
}
#if INCLUDE_CDS_JAVA_HEAP
bool ModuleEntry::should_be_archived() const {
return SystemDictionaryShared::is_builtin_loader(loader_data());
}
void ModuleEntry::remove_unshareable_info() {
_archived_module_index = HeapShared::append_root(module_oop());
if (_reads != nullptr) {
_reads->set_in_aot_cache();
}
// Clear handles and restore at run time. Handles cannot be archived.
_loader_data = cld;
}
void ModuleEntry::metaspace_pointers_do(MetaspaceClosure* it) {
it->push(&_name);
! if (!(is_named() && Modules::is_dynamic_proxy_module(this))) {
+ // This is a dynamically generated module. Its _reads will be
+ // restored at runtime in the Java code. See comments in ArchivedData::restore().
+ it->push(&_reads);
+ }
it->push(&_version);
it->push(&_location);
+
}
#if INCLUDE_CDS_JAVA_HEAP
bool ModuleEntry::should_be_archived() const {
return SystemDictionaryShared::is_builtin_loader(loader_data());
}
void ModuleEntry::remove_unshareable_info() {
_archived_module_index = HeapShared::append_root(module_oop());
+ if (is_named() && Modules::is_dynamic_proxy_module(ArchiveBuilder::current()->get_source_addr(this))) {
+ // See comments in ModuleEntry::metaspace_pointers_do()
+ _reads = nullptr;
+ }
+
if (_reads != nullptr) {
_reads->set_in_aot_cache();
}
// Clear handles and restore at run time. Handles cannot be archived.
}
JFR_ONLY(set_trace_id(0);) // re-init at runtime
}
void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) {
! assert(CDSConfig::is_using_archive(), "runtime only");
set_loader_data(loader_data);
JFR_ONLY(INIT_ID(this);)
}
void ModuleEntry::preload_archived_oops() {
(void)HeapShared::get_root(_archived_module_index, false /* clear */);
}
void ModuleEntry::restore_archived_oops(ClassLoaderData* loader_data) {
! assert(CDSConfig::is_using_archive(), "runtime only");
Handle module_handle(Thread::current(), HeapShared::get_root(_archived_module_index, /*clear=*/true));
assert(module_handle.not_null(), "huh");
set_module_handle(loader_data->add_handle(module_handle));
// This was cleared to zero during dump time -- we didn't save the value
}
JFR_ONLY(set_trace_id(0);) // re-init at runtime
}
void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) {
! assert(CDSConfig::is_using_full_module_graph(), "runtime only");
set_loader_data(loader_data);
JFR_ONLY(INIT_ID(this);)
}
void ModuleEntry::preload_archived_oops() {
(void)HeapShared::get_root(_archived_module_index, false /* clear */);
}
void ModuleEntry::restore_archived_oops(ClassLoaderData* loader_data) {
! assert(CDSConfig::is_using_full_module_graph(), "runtime only");
Handle module_handle(Thread::current(), HeapShared::get_root(_archived_module_index, /*clear=*/true));
assert(module_handle.not_null(), "huh");
set_module_handle(loader_data->add_handle(module_handle));
// This was cleared to zero during dump time -- we didn't save the value
print(&ls);
}
}
void ModuleEntry::clear_archived_oops() {
! assert(CDSConfig::is_using_archive(), "runtime only");
HeapShared::clear_root(_archived_module_index);
}
static int compare_module_by_name(ModuleEntry* a, ModuleEntry* b) {
assert(a == b || a->name() != b->name(), "no duplicated names");
print(&ls);
}
}
void ModuleEntry::clear_archived_oops() {
! assert(CDSConfig::is_using_archive() && !CDSConfig::is_using_full_module_graph(), "runtime only");
HeapShared::clear_root(_archived_module_index);
}
static int compare_module_by_name(ModuleEntry* a, ModuleEntry* b) {
assert(a == b || a->name() != b->name(), "no duplicated names");
return aot_table;
}
void ModuleEntryTable::load_archived_entries(ClassLoaderData* loader_data,
Array<ModuleEntry*>* archived_modules) {
! assert(CDSConfig::is_using_archive(), "runtime only");
for (int i = 0; i < archived_modules->length(); i++) {
ModuleEntry* archived_entry = archived_modules->at(i);
archived_entry->load_from_archive(loader_data);
_table.put(archived_entry->name(), archived_entry);
}
}
void ModuleEntryTable::restore_archived_oops(ClassLoaderData* loader_data, Array<ModuleEntry*>* archived_modules) {
! assert(CDSConfig::is_using_archive(), "runtime only");
for (int i = 0; i < archived_modules->length(); i++) {
ModuleEntry* archived_entry = archived_modules->at(i);
archived_entry->restore_archived_oops(loader_data);
}
}
return aot_table;
}
void ModuleEntryTable::load_archived_entries(ClassLoaderData* loader_data,
Array<ModuleEntry*>* archived_modules) {
! assert(CDSConfig::is_using_full_module_graph(), "runtime only");
for (int i = 0; i < archived_modules->length(); i++) {
ModuleEntry* archived_entry = archived_modules->at(i);
archived_entry->load_from_archive(loader_data);
_table.put(archived_entry->name(), archived_entry);
}
}
void ModuleEntryTable::restore_archived_oops(ClassLoaderData* loader_data, Array<ModuleEntry*>* archived_modules) {
! assert(CDSConfig::is_using_full_module_graph(), "runtime only");
for (int i = 0; i < archived_modules->length(); i++) {
ModuleEntry* archived_entry = archived_modules->at(i);
archived_entry->restore_archived_oops(loader_data);
}
}
< prev index next >