< prev index next > src/hotspot/share/classfile/javaClasses.cpp
Print this page
}
}
}
}
! if (k->is_shared() && k->has_raw_archived_mirror()) {
if (HeapShared::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->clear_java_mirror_handle();
! k->clear_has_raw_archived_mirror();
}
}
create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK);
}
}
}
}
}
! if (k->is_shared() && k->has_archived_mirror_index()) {
if (HeapShared::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->clear_java_mirror_handle();
! k->clear_archived_mirror_index();
}
}
create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK);
}
oop java_lang_Class::archive_mirror(Klass* k, TRAPS) {
assert(HeapShared::is_heap_object_archiving_allowed(),
"HeapShared::is_heap_object_archiving_allowed() must be true");
// Mirror is already archived
! if (k->has_raw_archived_mirror()) {
! assert(k->archived_java_mirror_raw() != NULL, "no archived mirror");
! return k->archived_java_mirror_raw();
}
// No mirror
oop mirror = k->java_mirror();
if (mirror == NULL) {
oop java_lang_Class::archive_mirror(Klass* k, TRAPS) {
assert(HeapShared::is_heap_object_archiving_allowed(),
"HeapShared::is_heap_object_archiving_allowed() must be true");
// Mirror is already archived
! if (k->has_archived_mirror_index()) {
! assert(k->archived_java_mirror() != NULL, "no archived mirror");
! return k->archived_java_mirror();
}
// No mirror
oop mirror = k->java_mirror();
if (mirror == NULL) {
archived_mirror = process_archived_mirror(k, mirror, archived_mirror, THREAD);
if (archived_mirror == NULL) {
return NULL;
}
! k->set_archived_java_mirror_raw(archived_mirror);
-
- k->set_has_raw_archived_mirror();
ResourceMark rm;
log_trace(cds, heap, mirror)(
"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,
k->external_name(), p2i(mirror), p2i(archived_mirror));
archived_mirror = process_archived_mirror(k, mirror, archived_mirror, THREAD);
if (archived_mirror == NULL) {
return NULL;
}
! k->set_archived_java_mirror(archived_mirror);
ResourceMark rm;
log_trace(cds, heap, mirror)(
"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,
k->external_name(), p2i(mirror), p2i(archived_mirror));
assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
fixup_mirror_list()->push(k);
return true;
}
! oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
! if (m == NULL) {
! return false;
! }
// mirror is archived, restore
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
assert(as_Klass(m) == k, "must be");
assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
fixup_mirror_list()->push(k);
return true;
}
! oop m = k->archived_java_mirror();
! assert(m != NULL, "must have stored non-null archived mirror");
!
! // Sanity: clear it now to prevent re-initialization if any of the following fails
+ k->clear_archived_mirror_index();
// mirror is archived, restore
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
assert(as_Klass(m) == k, "must be");
if (class_loader.not_null()) {
set_class_loader(mirror(), class_loader());
}
k->set_java_mirror(mirror);
- k->clear_has_raw_archived_mirror();
set_mirror_module_field(k, mirror, module, THREAD);
if (log_is_enabled(Trace, cds, heap, mirror)) {
ResourceMark rm(THREAD);
< prev index next >