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());
|