< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
rev 50453 : imported patch 02.removeInArchiveRoot
rev 50454 : imported patch cleanups
*** 61,71 ****
#include "runtime/safepointVerifiers.hpp"
#include "runtime/thread.inline.hpp"
#include "runtime/vframe.inline.hpp"
#include "utilities/align.hpp"
#include "utilities/preserveException.hpp"
-
#if INCLUDE_JVMCI
#include "jvmci/jvmciJavaClasses.hpp"
#endif
#define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
--- 61,70 ----
*** 807,822 ****
}
}
if (k->is_shared() && k->has_raw_archived_mirror()) {
if (MetaspaceShared::open_archive_heap_region_mapped()) {
! oop m = k->archived_java_mirror();
! assert(m != NULL, "archived mirror is NULL");
! assert(MetaspaceShared::is_archive_object(m), "must be archived mirror object");
! Handle m_h(THREAD, m);
! // restore_archived_mirror() clears the klass' _has_raw_archived_mirror flag
! restore_archived_mirror(k, m_h, Handle(), Handle(), Handle(), CHECK);
return;
} else {
k->set_java_mirror_handle(NULL);
k->clear_has_raw_archived_mirror();
}
--- 806,817 ----
}
}
if (k->is_shared() && k->has_raw_archived_mirror()) {
if (MetaspaceShared::open_archive_heap_region_mapped()) {
! bool present = restore_archived_mirror(k, Handle(), Handle(), Handle(), CHECK);
! assert(present, "Missing archived mirror for %s", k->external_name());
return;
} else {
k->set_java_mirror_handle(NULL);
k->clear_has_raw_archived_mirror();
}
*** 1205,1229 ****
archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
}
return archived_mirror;
}
! // After the archived mirror object is restored, the shared klass'
! // _has_raw_archived_mirror flag is cleared
! void java_lang_Class::restore_archived_mirror(Klass *k, Handle mirror,
Handle class_loader, Handle module,
Handle protection_domain, TRAPS) {
// The java.lang.Class field offsets were archived and reloaded from archive.
// No need to put classes on the fixup_mirror_list before java.lang.Class
// is loaded.
if (!k->is_array_klass()) {
// - local static final fields with initial values were initialized at dump time
// create the init_lock
! typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);
set_init_lock(mirror(), r);
if (protection_domain.not_null()) {
set_protection_domain(mirror(), protection_domain());
}
--- 1200,1236 ----
archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
}
return archived_mirror;
}
! // Returns true if the mirror is updated, false if no archived mirror
! // data is present. After the archived mirror object is restored, the
! // shared klass' _has_raw_archived_mirror flag is cleared.
! bool java_lang_Class::restore_archived_mirror(Klass *k,
Handle class_loader, Handle module,
Handle protection_domain, TRAPS) {
+ oop m = MetaspaceShared::unarchive_heap_object(k->archived_java_mirror_raw());
+
+ if (m == NULL) {
+ return false;
+ }
+
+ log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
+
+ // mirror is archived, restore
+ assert(MetaspaceShared::is_archive_object(m), "must be archived mirror object");
+ Handle mirror(THREAD, m);
// The java.lang.Class field offsets were archived and reloaded from archive.
// No need to put classes on the fixup_mirror_list before java.lang.Class
// is loaded.
if (!k->is_array_klass()) {
// - local static final fields with initial values were initialized at dump time
// create the init_lock
! typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
set_init_lock(mirror(), r);
if (protection_domain.not_null()) {
set_protection_domain(mirror(), protection_domain());
}
*** 1239,1248 ****
--- 1246,1257 ----
set_mirror_module_field(k, mirror, module, THREAD);
ResourceMark rm;
log_trace(cds, mirror)("Restored %s archived mirror " PTR_FORMAT, k->external_name(), p2i(mirror()));
+
+ return true;
}
#endif // INCLUDE_CDS_JAVA_HEAP
void java_lang_Class::fixup_module_field(Klass* k, Handle module) {
assert(_module_offset != 0, "must have been computed already");
< prev index next >