@@ -133,7 +133,10 @@ KlassSubGraphInfo* HeapShared::_default_subgraph_info;
133133GrowableArrayCHeap<oop, mtClassShared>* HeapShared::_pending_roots = nullptr ;
134134OopHandle HeapShared::_roots;
135135OopHandle HeapShared::_scratch_basic_type_mirrors[T_VOID+1 ];
136- KlassToOopHandleTable* HeapShared::_scratch_java_mirror_table = nullptr ;
136+ MetaspaceObjToOopHandleTable* HeapShared::_scratch_java_mirror_table = nullptr ;
137+ MetaspaceObjToOopHandleTable* HeapShared::_scratch_references_table = nullptr ;
138+ ClassLoaderData* HeapShared::_saved_java_platform_loader_data = nullptr ;
139+ ClassLoaderData* HeapShared::_saved_java_system_loader_data = nullptr ;
137140
138141static bool is_subgraph_root_class_of (ArchivableStaticFieldInfo fields[], InstanceKlass* ik) {
139142 for (int i = 0 ; fields[i].valid (); i++) {
@@ -298,47 +301,66 @@ bool HeapShared::archive_object(oop obj) {
298301 }
299302 java_lang_Module::set_module_entry (obj, nullptr );
300303 } else if (java_lang_ClassLoader::is_instance (obj)) {
301- // class_data will be restored explicitly at run time.
304+ // class_data will be restored explicitly at run time and after dumptime
302305 guarantee (obj == SystemDictionary::java_platform_loader () ||
303306 obj == SystemDictionary::java_system_loader () ||
304307 java_lang_ClassLoader::loader_data (obj) == nullptr , " must be" );
308+ if (obj == SystemDictionary::java_platform_loader ()) {
309+ _saved_java_platform_loader_data = java_lang_ClassLoader::loader_data_acquire (SystemDictionary::java_platform_loader ());
310+ } else if (obj == SystemDictionary::java_system_loader ()) {
311+ _saved_java_system_loader_data = java_lang_ClassLoader::loader_data_acquire (SystemDictionary::java_system_loader ());
312+ }
305313 java_lang_ClassLoader::release_set_loader_data (obj, nullptr );
306314 }
307315
308316 return true ;
309317 }
310318}
311319
312- class KlassToOopHandleTable : public ResourceHashtable <Klass*, OopHandle,
320+ void HeapShared::restore_loader_data () {
321+ log_info (cds)(" Restoring java platform and system loaders" );
322+ java_lang_ClassLoader::release_set_loader_data (SystemDictionary::java_platform_loader (), _saved_java_platform_loader_data);
323+ java_lang_ClassLoader::release_set_loader_data (SystemDictionary::java_system_loader (), _saved_java_system_loader_data);
324+ }
325+
326+ class MetaspaceObjToOopHandleTable : public ResourceHashtable <MetaspaceObj*, OopHandle,
313327 36137 , // prime number
314328 AnyObj::C_HEAP,
315329 mtClassShared> {
316330public:
317- oop get_oop (Klass* k ) {
331+ oop get_oop (MetaspaceObj* ptr ) {
318332 MutexLocker ml (ScratchObjects_lock, Mutex::_no_safepoint_check_flag);
319- OopHandle* handle = get (k );
333+ OopHandle* handle = get (ptr );
320334 if (handle != nullptr ) {
321335 return handle->resolve ();
322336 } else {
323337 return nullptr ;
324338 }
325339 }
326- void set_oop (Klass* k , oop o) {
340+ void set_oop (MetaspaceObj* ptr , oop o) {
327341 MutexLocker ml (ScratchObjects_lock, Mutex::_no_safepoint_check_flag);
328342 OopHandle handle (Universe::vm_global (), o);
329- bool is_new = put (k , handle);
343+ bool is_new = put (ptr , handle);
330344 assert (is_new, " cannot set twice" );
331345 }
332- void remove_oop (Klass* k ) {
346+ void remove_oop (MetaspaceObj* ptr ) {
333347 MutexLocker ml (ScratchObjects_lock, Mutex::_no_safepoint_check_flag);
334- OopHandle* handle = get (k );
348+ OopHandle* handle = get (ptr );
335349 if (handle != nullptr ) {
336350 handle->release (Universe::vm_global ());
337- remove (k );
351+ remove (ptr );
338352 }
339353 }
340354};
341355
356+ void HeapShared::add_scratch_resolved_references (ConstantPool* src, objArrayOop dest) {
357+ _scratch_references_table->set_oop (src, dest);
358+ }
359+
360+ objArrayOop HeapShared::scratch_resolved_references (ConstantPool* src) {
361+ return (objArrayOop)_scratch_references_table->get_oop (src);
362+ }
363+
342364void HeapShared::init_scratch_objects (TRAPS) {
343365 for (int i = T_BOOLEAN; i < T_VOID+1 ; i++) {
344366 BasicType bt = (BasicType)i;
@@ -347,7 +369,8 @@ void HeapShared::init_scratch_objects(TRAPS) {
347369 _scratch_basic_type_mirrors[i] = OopHandle (Universe::vm_global (), m);
348370 }
349371 }
350- _scratch_java_mirror_table = new (mtClass)KlassToOopHandleTable ();
372+ _scratch_java_mirror_table = new (mtClass)MetaspaceObjToOopHandleTable ();
373+ _scratch_references_table = new (mtClass)MetaspaceObjToOopHandleTable ();
351374}
352375
353376oop HeapShared::scratch_java_mirror (BasicType t) {
@@ -366,6 +389,9 @@ void HeapShared::set_scratch_java_mirror(Klass* k, oop mirror) {
366389
367390void HeapShared::remove_scratch_objects (Klass* k) {
368391 _scratch_java_mirror_table->remove_oop (k);
392+ if (k->is_instance_klass ()) {
393+ _scratch_references_table->remove (InstanceKlass::cast (k)->constants ());
394+ }
369395}
370396
371397void HeapShared::archive_java_mirrors () {
0 commit comments