< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page


1198   // klass in the archive.
1199   Klass *reloc_k = MetaspaceShared::get_relocated_klass(as_Klass(mirror), true);
1200   log_debug(cds, heap, mirror)(
1201     "Relocate mirror metadata field at _klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1202     p2i(as_Klass(mirror)), p2i(reloc_k));
1203   archived_mirror->metadata_field_put(_klass_offset, reloc_k);
1204 
1205   // The field at _array_klass_offset is pointing to the original one dimension
1206   // higher array klass if exists. Relocate the pointer.
1207   Klass *arr = array_klass_acquire(mirror);
1208   if (arr != NULL) {
1209     Klass *reloc_arr = MetaspaceShared::get_relocated_klass(arr, true);
1210     log_debug(cds, heap, mirror)(
1211       "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1212       p2i(arr), p2i(reloc_arr));
1213     archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
1214   }
1215   return archived_mirror;
1216 }
1217 











1218 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {

1219   Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1220   if (k != NULL) { // k is NULL for the primitive classes such as java.lang.Byte::TYPE
1221     archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta()));
1222   }
1223 
1224   Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1225   if (ak != NULL) {
1226     archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
1227   }

1228 }
1229 
1230 
1231 // Returns true if the mirror is updated, false if no archived mirror
1232 // data is present. After the archived mirror object is restored, the
1233 // shared klass' _has_raw_archived_mirror flag is cleared.
1234 bool java_lang_Class::restore_archived_mirror(Klass *k,
1235                                               Handle class_loader, Handle module,
1236                                               Handle protection_domain, TRAPS) {
1237   // Postpone restoring archived mirror until java.lang.Class is loaded. Please
1238   // see more details in SystemDictionary::resolve_well_known_classes().
1239   if (!SystemDictionary::Class_klass_loaded()) {
1240     assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1241     fixup_mirror_list()->push(k);
1242     return true;
1243   }
1244 
1245   oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
1246 
1247   if (m == NULL) {
1248     return false;
1249   }
1250 
1251   log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
1252   update_archived_mirror_native_pointers(m);
1253 
1254   // mirror is archived, restore

1255   assert(HeapShared::is_archived_object(m), "must be archived mirror object");


1256   Handle mirror(THREAD, m);
1257 
1258   if (!k->is_array_klass()) {
1259     // - local static final fields with initial values were initialized at dump time
1260 
1261     // create the init_lock
1262     typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
1263     set_init_lock(mirror(), r);
1264 
1265     if (protection_domain.not_null()) {
1266       set_protection_domain(mirror(), protection_domain());
1267     }
1268   }
1269 
1270   assert(class_loader() == k->class_loader(), "should be same");
1271   if (class_loader.not_null()) {
1272     set_class_loader(mirror(), class_loader());
1273   }
1274 
1275   k->set_java_mirror(mirror);




1198   // klass in the archive.
1199   Klass *reloc_k = MetaspaceShared::get_relocated_klass(as_Klass(mirror), true);
1200   log_debug(cds, heap, mirror)(
1201     "Relocate mirror metadata field at _klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1202     p2i(as_Klass(mirror)), p2i(reloc_k));
1203   archived_mirror->metadata_field_put(_klass_offset, reloc_k);
1204 
1205   // The field at _array_klass_offset is pointing to the original one dimension
1206   // higher array klass if exists. Relocate the pointer.
1207   Klass *arr = array_klass_acquire(mirror);
1208   if (arr != NULL) {
1209     Klass *reloc_arr = MetaspaceShared::get_relocated_klass(arr, true);
1210     log_debug(cds, heap, mirror)(
1211       "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT,
1212       p2i(arr), p2i(reloc_arr));
1213     archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr);
1214   }
1215   return archived_mirror;
1216 }
1217 
1218 void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {
1219   if (MetaspaceShared::mapping_delta() != 0) {
1220     assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");
1221 
1222     Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1223     if (ak != NULL) {
1224       archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
1225     }
1226   }
1227 }
1228 
1229 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
1230   if (MetaspaceShared::mapping_delta() != 0) {
1231     Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));

1232     archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta()));

1233 
1234     Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1235     if (ak != NULL) {
1236       archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta()));
1237     }
1238   }
1239 }
1240 
1241 
1242 // Returns true if the mirror is updated, false if no archived mirror
1243 // data is present. After the archived mirror object is restored, the
1244 // shared klass' _has_raw_archived_mirror flag is cleared.
1245 bool java_lang_Class::restore_archived_mirror(Klass *k,
1246                                               Handle class_loader, Handle module,
1247                                               Handle protection_domain, TRAPS) {
1248   // Postpone restoring archived mirror until java.lang.Class is loaded. Please
1249   // see more details in SystemDictionary::resolve_well_known_classes().
1250   if (!SystemDictionary::Class_klass_loaded()) {
1251     assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1252     fixup_mirror_list()->push(k);
1253     return true;
1254   }
1255 
1256   oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());

1257   if (m == NULL) {
1258     return false;
1259   }
1260 



1261   // mirror is archived, restore
1262   log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
1263   assert(HeapShared::is_archived_object(m), "must be archived mirror object");
1264   update_archived_mirror_native_pointers(m);
1265   assert(as_Klass(m) == k, "must be");
1266   Handle mirror(THREAD, m);
1267 
1268   if (!k->is_array_klass()) {
1269     // - local static final fields with initial values were initialized at dump time
1270 
1271     // create the init_lock
1272     typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
1273     set_init_lock(mirror(), r);
1274 
1275     if (protection_domain.not_null()) {
1276       set_protection_domain(mirror(), protection_domain());
1277     }
1278   }
1279 
1280   assert(class_loader() == k->class_loader(), "should be same");
1281   if (class_loader.not_null()) {
1282     set_class_loader(mirror(), class_loader());
1283   }
1284 
1285   k->set_java_mirror(mirror);


< prev index next >