< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
rev 50453 : imported patch 02.removeInArchiveRoot
rev 50454 : imported patch cleanups
@@ -61,11 +61,10 @@
#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) \
@@ -807,16 +806,12 @@
}
}
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);
+ 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,25 +1200,37 @@
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,
+// 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);
+ 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,10 +1246,12 @@
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 >