< prev index next >

src/hotspot/share/classfile/classLoaderDataShared.cpp

Print this page

 98     // address of the Symbols, which may be relocated at runtime due to ASLR.
 99     // So we store the packages/modules in Arrays. At runtime, we create
100     // the hashtables using these arrays.
101     _packages = loader_data->packages()->allocate_archived_entries();
102     _modules  = loader_data->modules() ->allocate_archived_entries();
103     _unnamed_module = loader_data->unnamed_module()->allocate_archived_entry();
104   }
105 }
106 
107 void ArchivedClassLoaderData::init_archived_entries(ClassLoaderData* loader_data) {
108   assert(CDSConfig::is_dumping_full_module_graph(), "must be");
109   assert_valid(loader_data);
110   if (loader_data != nullptr) {
111     loader_data->packages()->init_archived_entries(_packages);
112     loader_data->modules() ->init_archived_entries(_modules);
113     _unnamed_module->init_as_archived_entry();
114   }
115 }
116 
117 void ArchivedClassLoaderData::restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops) {
118   assert(CDSConfig::is_using_archive(), "must be");
119   assert_valid(loader_data);
120   if (_modules != nullptr) { // Could be null if we have archived no modules for platform/system loaders
121     ModuleEntryTable* modules = loader_data->modules();
122     PackageEntryTable* packages = loader_data->packages();
123 
124     MutexLocker m1(Module_lock);
125     if (do_entries) {
126       modules->load_archived_entries(loader_data, _modules);
127       packages->load_archived_entries(_packages);
128     }
129     if (do_oops) {
130       modules->restore_archived_oops(loader_data, _modules);
131       if (_unnamed_module != nullptr) {
132         oop module_oop = _unnamed_module->module_oop();
133         assert(module_oop != nullptr, "must be already set");
134         assert(_unnamed_module == java_lang_Module::module_entry(module_oop), "must be already set");
135         assert(loader_data->class_loader() == java_lang_Module::loader(module_oop), "must be set in dump time");
136       }
137     }
138   }
139 }
140 
141 void ArchivedClassLoaderData::clear_archived_oops() {
142   assert(CDSConfig::is_using_archive(), "must be");
143   if (_modules != nullptr) {
144     for (int i = 0; i < _modules->length(); i++) {
145       _modules->at(i)->clear_archived_oops();
146     }
147     if (_unnamed_module != nullptr) {
148       _unnamed_module->clear_archived_oops();
149     }
150   }
151 }
152 
153 // ------------------------------
154 
155 static ClassLoaderData* null_class_loader_data() {
156   ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
157   assert(loader_data != nullptr, "must be");
158   return loader_data;
159 }
160 
161 static ClassLoaderData* java_platform_loader_data_or_null() {
162   return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader());

 98     // address of the Symbols, which may be relocated at runtime due to ASLR.
 99     // So we store the packages/modules in Arrays. At runtime, we create
100     // the hashtables using these arrays.
101     _packages = loader_data->packages()->allocate_archived_entries();
102     _modules  = loader_data->modules() ->allocate_archived_entries();
103     _unnamed_module = loader_data->unnamed_module()->allocate_archived_entry();
104   }
105 }
106 
107 void ArchivedClassLoaderData::init_archived_entries(ClassLoaderData* loader_data) {
108   assert(CDSConfig::is_dumping_full_module_graph(), "must be");
109   assert_valid(loader_data);
110   if (loader_data != nullptr) {
111     loader_data->packages()->init_archived_entries(_packages);
112     loader_data->modules() ->init_archived_entries(_modules);
113     _unnamed_module->init_as_archived_entry();
114   }
115 }
116 
117 void ArchivedClassLoaderData::restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops) {
118   assert(CDSConfig::is_using_full_module_graph(), "must be");
119   assert_valid(loader_data);
120   if (_modules != nullptr) { // Could be null if we have archived no modules for platform/system loaders
121     ModuleEntryTable* modules = loader_data->modules();
122     PackageEntryTable* packages = loader_data->packages();
123 
124     MutexLocker m1(Module_lock);
125     if (do_entries) {
126       modules->load_archived_entries(loader_data, _modules);
127       packages->load_archived_entries(_packages);
128     }
129     if (do_oops) {
130       modules->restore_archived_oops(loader_data, _modules);
131       if (_unnamed_module != nullptr) {
132         oop module_oop = _unnamed_module->module_oop();
133         assert(module_oop != nullptr, "must be already set");
134         assert(_unnamed_module == java_lang_Module::module_entry(module_oop), "must be already set");
135         assert(loader_data->class_loader() == java_lang_Module::loader(module_oop), "must be set in dump time");
136       }
137     }
138   }
139 }
140 
141 void ArchivedClassLoaderData::clear_archived_oops() {
142   assert(!CDSConfig::is_using_full_module_graph(), "must be");
143   if (_modules != nullptr) {
144     for (int i = 0; i < _modules->length(); i++) {
145       _modules->at(i)->clear_archived_oops();
146     }
147     if (_unnamed_module != nullptr) {
148       _unnamed_module->clear_archived_oops();
149     }
150   }
151 }
152 
153 // ------------------------------
154 
155 static ClassLoaderData* null_class_loader_data() {
156   ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
157   assert(loader_data != nullptr, "must be");
158   return loader_data;
159 }
160 
161 static ClassLoaderData* java_platform_loader_data_or_null() {
162   return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader());
< prev index next >