1 /*
2 * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "cds/aotClassLocation.hpp"
26 #include "cds/archiveBuilder.hpp"
27 #include "cds/archiveUtils.hpp"
28 #include "cds/cdsConfig.hpp"
29 #include "cds/heapShared.hpp"
30 #include "classfile/classLoader.hpp"
31 #include "classfile/classLoaderData.inline.hpp"
32 #include "classfile/classLoaderDataShared.hpp"
33 #include "classfile/javaClasses.inline.hpp"
34 #include "classfile/moduleEntry.hpp"
35 #include "classfile/systemDictionary.hpp"
36 #include "classfile/systemDictionaryShared.hpp"
37 #include "jni.h"
38 #include "logging/log.hpp"
39 #include "logging/logStream.hpp"
40 #include "memory/resourceArea.hpp"
41 #include "memory/universe.hpp"
42 #include "oops/oopHandle.inline.hpp"
43 #include "oops/symbol.hpp"
44 #include "runtime/handles.inline.hpp"
45 #include "runtime/safepoint.hpp"
46 #include "utilities/events.hpp"
47 #include "utilities/growableArray.hpp"
48 #include "utilities/hashTable.hpp"
49 #include "utilities/ostream.hpp"
50 #include "utilities/quickSort.hpp"
51
52 ModuleEntry* ModuleEntryTable::_javabase_module = nullptr;
53
54 oop ModuleEntry::module_oop() const { return _module_handle.resolve(); }
55
56 void ModuleEntry::set_location(Symbol* location) {
57 // _location symbol's refcounts are managed by ModuleEntry,
58 // must decrement the old one before updating.
59 Symbol::maybe_decrement_refcount(_location);
60
61 _location = location;
62
63 if (location != nullptr) {
64 location->increment_refcount();
65 CDS_ONLY(if (CDSConfig::is_using_archive()) {
66 _shared_path_index = AOTClassLocationConfig::runtime()->get_module_shared_path_index(_location);
67 });
68 }
69 }
70
71 // Return true if the module's version should be displayed in error messages,
72 // logging, etc.
73 // Return false if the module's version is null, if it is unnamed, or if the
74 // module is not an upgradeable module.
75 // Detect if the module is not upgradeable by checking:
76 // 1. Module location is "jrt:/java." and its loader is boot or platform
77 // 2. Module location is "jrt:/jdk.", its loader is one of the builtin loaders
78 // and its version is the same as module java.base's version
79 // The above check is imprecise but should work in almost all cases.
80 bool ModuleEntry::should_show_version() {
81 if (version() == nullptr || !is_named()) return false;
82
83 if (location() != nullptr) {
84 ResourceMark rm;
85 const char* loc = location()->as_C_string();
86 ClassLoaderData* cld = loader_data();
87
88 assert(!cld->has_class_mirror_holder(), "module's cld should have a ClassLoader holder not a Class holder");
89 if ((cld->is_the_null_class_loader_data() || cld->is_platform_class_loader_data()) &&
90 (strncmp(loc, "jrt:/java.", 10) == 0)) {
91 return false;
92 }
93 if ((ModuleEntryTable::javabase_moduleEntry()->version()->fast_compare(version()) == 0) &&
94 cld->is_permanent_class_loader_data() && (strncmp(loc, "jrt:/jdk.", 9) == 0)) {
95 return false;
96 }
97 }
98 return true;
99 }
100
101 void ModuleEntry::set_version(Symbol* version) {
102 // _version symbol's refcounts are managed by ModuleEntry,
103 // must decrement the old one before updating.
104 Symbol::maybe_decrement_refcount(_version);
105
106 _version = version;
107
108 Symbol::maybe_increment_refcount(version);
109 }
110
111 // Returns the shared ProtectionDomain
112 oop ModuleEntry::shared_protection_domain() {
113 return _shared_pd.resolve();
114 }
115
116 // Set the shared ProtectionDomain atomically
117 void ModuleEntry::set_shared_protection_domain(ClassLoaderData *loader_data,
118 Handle pd_h) {
119 // Create a handle for the shared ProtectionDomain and save it atomically.
120 // init_handle_locked checks if someone beats us setting the _shared_pd cache.
121 loader_data->init_handle_locked(_shared_pd, pd_h);
122 }
123
124 // Returns true if this module can read module m
125 bool ModuleEntry::can_read(ModuleEntry* m) const {
126 assert(m != nullptr, "No module to lookup in this module's reads list");
127
128 // Unnamed modules read everyone and all modules
129 // read java.base. If either of these conditions
130 // hold, readability has been established.
131 if (!this->is_named() ||
132 (m == ModuleEntryTable::javabase_moduleEntry())) {
133 return true;
134 }
135
136 MutexLocker m1(Module_lock);
137 // This is a guard against possible race between agent threads that redefine
138 // or retransform classes in this module. Only one of them is adding the
139 // default read edges to the unnamed modules of the boot and app class loaders
140 // with an upcall to jdk.internal.module.Modules.transformedByAgent.
141 // At the same time, another thread can instrument the module classes by
142 // injecting dependencies that require the default read edges for resolution.
143 if (this->has_default_read_edges() && !m->is_named()) {
144 ClassLoaderData* cld = m->loader_data();
145 assert(!cld->has_class_mirror_holder(), "module's cld should have a ClassLoader holder not a Class holder");
146 if (cld->is_the_null_class_loader_data() || cld->is_system_class_loader_data()) {
147 return true; // default read edge
148 }
149 }
150 if (!has_reads_list()) {
151 return false;
152 } else {
153 return reads()->contains(m);
154 }
155 }
156
157 // Add a new module to this module's reads list
158 void ModuleEntry::add_read(ModuleEntry* m) {
159 // Unnamed module is special cased and can read all modules
160 if (!is_named()) {
161 return;
162 }
163
164 MutexLocker m1(Module_lock);
165 if (m == nullptr) {
166 set_can_read_all_unnamed();
167 } else {
168 if (reads() == nullptr) {
169 // Lazily create a module's reads list
170 GrowableArray<ModuleEntry*>* new_reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule);
171 set_reads(new_reads);
172 }
173
174 // Determine, based on this newly established read edge to module m,
175 // if this module's read list should be walked at a GC safepoint.
176 set_read_walk_required(m->loader_data());
177
178 // Establish readability to module m
179 reads()->append_if_missing(m);
180 }
181 }
182
183 // If the module's loader, that a read edge is being established to, is
184 // not the same loader as this module's and is not one of the 3 builtin
185 // class loaders, then this module's reads list must be walked at GC
186 // safepoint. Modules have the same life cycle as their defining class
187 // loaders and should be removed if dead.
188 void ModuleEntry::set_read_walk_required(ClassLoaderData* m_loader_data) {
189 assert(is_named(), "Cannot call set_read_walk_required on unnamed module");
190 assert_locked_or_safepoint(Module_lock);
191 if (!_must_walk_reads &&
192 loader_data() != m_loader_data &&
193 !m_loader_data->is_builtin_class_loader_data()) {
194 _must_walk_reads = true;
195 if (log_is_enabled(Trace, module)) {
196 ResourceMark rm;
197 log_trace(module)("ModuleEntry::set_read_walk_required(): module %s reads list must be walked",
198 (name() != nullptr) ? name()->as_C_string() : UNNAMED_MODULE);
199 }
200 }
201 }
202
203 // Set whether the module is open, i.e. all its packages are unqualifiedly exported
204 void ModuleEntry::set_is_open(bool is_open) {
205 assert_lock_strong(Module_lock);
206 _is_open = is_open;
207 }
208
209 // Returns true if the module has a non-empty reads list. As such, the unnamed
210 // module will return false.
211 bool ModuleEntry::has_reads_list() const {
212 assert_locked_or_safepoint(Module_lock);
213 return ((reads() != nullptr) && !reads()->is_empty());
214 }
215
216 // Purge dead module entries out of reads list.
217 void ModuleEntry::purge_reads() {
218 assert_locked_or_safepoint(Module_lock);
219
220 if (_must_walk_reads && has_reads_list()) {
221 // This module's _must_walk_reads flag will be reset based
222 // on the remaining live modules on the reads list.
223 _must_walk_reads = false;
224
225 if (log_is_enabled(Trace, module)) {
226 ResourceMark rm;
227 log_trace(module)("ModuleEntry::purge_reads(): module %s reads list being walked",
228 (name() != nullptr) ? name()->as_C_string() : UNNAMED_MODULE);
229 }
230
231 // Go backwards because this removes entries that are dead.
232 int len = reads()->length();
233 for (int idx = len - 1; idx >= 0; idx--) {
234 ModuleEntry* module_idx = reads()->at(idx);
235 ClassLoaderData* cld_idx = module_idx->loader_data();
236 if (cld_idx->is_unloading()) {
237 reads()->delete_at(idx);
238 } else {
239 // Update the need to walk this module's reads based on live modules
240 set_read_walk_required(cld_idx);
241 }
242 }
243 }
244 }
245
246 void ModuleEntry::module_reads_do(ModuleClosure* f) {
247 assert_locked_or_safepoint(Module_lock);
248 assert(f != nullptr, "invariant");
249
250 if (has_reads_list()) {
251 int reads_len = reads()->length();
252 for (ModuleEntry* m : *reads()) {
253 f->do_module(m);
254 }
255 }
256 }
257
258 void ModuleEntry::delete_reads() {
259 delete reads();
260 _reads = nullptr;
261 }
262
263 ModuleEntry::ModuleEntry(Handle module_handle,
264 bool is_open, Symbol* name,
265 Symbol* version, Symbol* location,
266 ClassLoaderData* loader_data) :
267 _name(name),
268 _loader_data(loader_data),
269 _reads(nullptr),
270 _version(nullptr),
271 _location(nullptr),
272 CDS_ONLY(_shared_path_index(-1) COMMA)
273 _can_read_all_unnamed(false),
274 _has_default_read_edges(false),
275 _must_walk_reads(false),
276 _is_open(is_open),
277 _is_patched(false)
278 DEBUG_ONLY(COMMA _reads_is_archived(false)) {
279
280 // Initialize fields specific to a ModuleEntry
281 if (_name == nullptr) {
282 // Unnamed modules can read all other unnamed modules.
283 set_can_read_all_unnamed();
284 } else {
285 _name->increment_refcount();
286 }
287
288 if (!module_handle.is_null()) {
289 _module_handle = loader_data->add_handle(module_handle);
290 }
291
292 set_version(version);
293
294 // may need to add CDS info
295 set_location(location);
296
297 if (name != nullptr && ClassLoader::is_in_patch_mod_entries(name)) {
298 set_is_patched();
299 if (log_is_enabled(Trace, module, patch)) {
300 ResourceMark rm;
301 log_trace(module, patch)("Marked module %s as patched from --patch-module",
302 name != nullptr ? name->as_C_string() : UNNAMED_MODULE);
303 }
304 }
305
306 JFR_ONLY(INIT_ID(this);)
307 }
308
309 ModuleEntry::~ModuleEntry() {
310 // Clean out the C heap allocated reads list first before freeing the entry
311 delete_reads();
312 Symbol::maybe_decrement_refcount(_name);
313 Symbol::maybe_decrement_refcount(_version);
314 Symbol::maybe_decrement_refcount(_location);
315 }
316
317 ModuleEntry* ModuleEntry::create_unnamed_module(ClassLoaderData* cld) {
318 // The java.lang.Module for this loader's
319 // corresponding unnamed module can be found in the java.lang.ClassLoader object.
320 oop module = java_lang_ClassLoader::unnamedModule(cld->class_loader());
321
322 #if INCLUDE_CDS_JAVA_HEAP
323 ModuleEntry* archived_unnamed_module = ClassLoaderDataShared::archived_unnamed_module(cld);
324 if (archived_unnamed_module != nullptr) {
325 archived_unnamed_module->load_from_archive(cld);
326 archived_unnamed_module->restore_archived_oops(cld);
327 return archived_unnamed_module;
328 }
329 #endif
330
331 // Ensure that the unnamed module was correctly set when the class loader was constructed.
332 // Guarantee will cause a recognizable crash if the user code has circumvented calling the ClassLoader constructor.
333 ResourceMark rm;
334 guarantee(java_lang_Module::is_instance(module),
335 "The unnamed module for ClassLoader %s, is null or not an instance of java.lang.Module. The class loader has not been initialized correctly.",
336 cld->loader_name_and_id());
337
338 ModuleEntry* unnamed_module = new_unnamed_module_entry(Handle(Thread::current(), module), cld);
339
340 // Store pointer to the ModuleEntry in the unnamed module's java.lang.Module object.
341 java_lang_Module::set_module_entry(module, unnamed_module);
342
343 return unnamed_module;
344 }
345
346 ModuleEntry* ModuleEntry::create_boot_unnamed_module(ClassLoaderData* cld) {
347 #if INCLUDE_CDS_JAVA_HEAP
348 ModuleEntry* archived_unnamed_module = ClassLoaderDataShared::archived_boot_unnamed_module();
349 if (archived_unnamed_module != nullptr) {
350 archived_unnamed_module->load_from_archive(cld);
351 // It's too early to call archived_unnamed_module->restore_archived_oops(cld).
352 // We will do it inside Modules::set_bootloader_unnamed_module()
353 return archived_unnamed_module;
354 }
355 #endif
356
357 // For the boot loader, the java.lang.Module for the unnamed module
358 // is not known until a call to JVM_SetBootLoaderUnnamedModule is made. At
359 // this point initially create the ModuleEntry for the unnamed module.
360 ModuleEntry* unnamed_module = new_unnamed_module_entry(Handle(), cld);
361 assert(unnamed_module != nullptr, "boot loader unnamed module should not be null");
362 return unnamed_module;
363 }
364
365 // When creating an unnamed module, this is called without holding the Module_lock.
366 // This is okay because the unnamed module gets created before the ClassLoaderData
367 // is available to other threads.
368 ModuleEntry* ModuleEntry::new_unnamed_module_entry(Handle module_handle, ClassLoaderData* cld) {
369 ModuleEntry* entry = new ModuleEntry(module_handle, /*is_open*/true, /*name*/nullptr,
370 /*version*/ nullptr, /*location*/ nullptr,
371 cld);
372 // Unnamed modules can read all other unnamed modules.
373 assert(entry->can_read_all_unnamed(), "constructor set that");
374 return entry;
375 }
376
377 ModuleEntryTable::ModuleEntryTable() { }
378
379 ModuleEntryTable::~ModuleEntryTable() {
380 class ModuleEntryTableDeleter : public StackObj {
381 public:
382 bool do_entry(const SymbolHandle& name, ModuleEntry*& entry) {
383 if (log_is_enabled(Info, module, unload) || log_is_enabled(Debug, module)) {
384 ResourceMark rm;
385 const char* str = name->as_C_string();
386 log_info(module, unload)("unloading module %s", str);
387 log_debug(module)("ModuleEntryTable: deleting module: %s", str);
388 }
389 delete entry;
390 return true;
391 }
392 };
393
394 ModuleEntryTableDeleter deleter;
395 _table.unlink(&deleter);
396 assert(_table.number_of_entries() == 0, "should have removed all entries");
397
398 }
399
400 void ModuleEntry::set_loader_data(ClassLoaderData* cld) {
401 assert(!cld->has_class_mirror_holder(), "Unexpected has_class_mirror_holder cld");
402 _loader_data = cld;
403 }
404
405 #if INCLUDE_CDS_JAVA_HEAP
406 typedef HashTable<
407 const ModuleEntry*,
408 ModuleEntry*,
409 557, // prime number
410 AnyObj::C_HEAP> ArchivedModuleEntries;
411 static ArchivedModuleEntries* _archive_modules_entries = nullptr;
412
413 #ifndef PRODUCT
414 static int _num_archived_module_entries = 0;
415 static int _num_inited_module_entries = 0;
416 #endif
417
418 bool ModuleEntry::should_be_archived() const {
419 return SystemDictionaryShared::is_builtin_loader(loader_data());
420 }
421
422 ModuleEntry* ModuleEntry::allocate_archived_entry() const {
423 precond(should_be_archived());
424 precond(CDSConfig::is_dumping_full_module_graph());
425 ModuleEntry* archived_entry = (ModuleEntry*)ArchiveBuilder::rw_region_alloc(sizeof(ModuleEntry));
426 memcpy((void*)archived_entry, (void*)this, sizeof(ModuleEntry));
427
428 archived_entry->_archived_module_index = HeapShared::append_root(module_oop());
429 if (_archive_modules_entries == nullptr) {
430 _archive_modules_entries = new (mtClass)ArchivedModuleEntries();
431 }
432 assert(_archive_modules_entries->get(this) == nullptr, "Each ModuleEntry must not be shared across ModuleEntryTables");
433 _archive_modules_entries->put(this, archived_entry);
434 DEBUG_ONLY(_num_archived_module_entries++);
435
436 if (CDSConfig::is_dumping_final_static_archive()) {
437 OopHandle null_handle;
438 archived_entry->_shared_pd = null_handle;
439 } else {
440 assert(archived_entry->shared_protection_domain() == nullptr, "never set during -Xshare:dump");
441 }
442
443 // Clear handles and restore at run time. Handles cannot be archived.
444 OopHandle null_handle;
445 archived_entry->_module_handle = null_handle;
446
447 // For verify_archived_module_entries()
448 DEBUG_ONLY(_num_inited_module_entries++);
449
450 if (log_is_enabled(Info, aot, module)) {
451 ResourceMark rm;
452 LogStream ls(Log(aot, module)::info());
453 ls.print("Stored in archive: ");
454 archived_entry->print(&ls);
455 }
456 return archived_entry;
457 }
458
459 bool ModuleEntry::has_been_archived() {
460 assert(!ArchiveBuilder::current()->is_in_buffer_space(this), "must be called on original ModuleEntry");
461 return _archive_modules_entries->contains(this);
462 }
463
464 ModuleEntry* ModuleEntry::get_archived_entry(ModuleEntry* orig_entry) {
465 ModuleEntry** ptr = _archive_modules_entries->get(orig_entry);
466 assert(ptr != nullptr && *ptr != nullptr, "must have been allocated");
467 return *ptr;
468 }
469
470 // This function is used to archive ModuleEntry::_reads and PackageEntry::_qualified_exports.
471 // GrowableArray cannot be directly archived, as it needs to be expandable at runtime.
472 // Write it out as an Array, and convert it back to GrowableArray at runtime.
473 Array<ModuleEntry*>* ModuleEntry::write_growable_array(GrowableArray<ModuleEntry*>* array) {
474 Array<ModuleEntry*>* archived_array = nullptr;
475 int length = (array == nullptr) ? 0 : array->length();
476 if (length > 0) {
477 archived_array = ArchiveBuilder::new_ro_array<ModuleEntry*>(length);
478 for (int i = 0; i < length; i++) {
479 ModuleEntry* archived_entry = get_archived_entry(array->at(i));
480 archived_array->at_put(i, archived_entry);
481 ArchivePtrMarker::mark_pointer((address*)archived_array->adr_at(i));
482 }
483 }
484
485 return archived_array;
486 }
487
488 GrowableArray<ModuleEntry*>* ModuleEntry::restore_growable_array(Array<ModuleEntry*>* archived_array) {
489 GrowableArray<ModuleEntry*>* array = nullptr;
490 int length = (archived_array == nullptr) ? 0 : archived_array->length();
491 if (length > 0) {
492 array = new (mtModule) GrowableArray<ModuleEntry*>(length, mtModule);
493 for (int i = 0; i < length; i++) {
494 ModuleEntry* archived_entry = archived_array->at(i);
495 array->append(archived_entry);
496 }
497 }
498
499 return array;
500 }
501
502 void ModuleEntry::iterate_symbols(MetaspaceClosure* closure) {
503 closure->push(&_name);
504 closure->push(&_version);
505 closure->push(&_location);
506 }
507
508 void ModuleEntry::init_as_archived_entry() {
509 set_archived_reads(write_growable_array(reads()));
510
511 _loader_data = nullptr; // re-init at runtime
512 if (name() != nullptr) {
513 _shared_path_index = AOTClassLocationConfig::dumptime()->get_module_shared_path_index(_location);
514 _name = ArchiveBuilder::get_buffered_symbol(_name);
515 ArchivePtrMarker::mark_pointer((address*)&_name);
516 } else {
517 // _shared_path_index is used only by SystemDictionary::is_shared_class_visible_impl()
518 // for checking classes in named modules.
519 _shared_path_index = -1;
520 }
521 if (_version != nullptr) {
522 _version = ArchiveBuilder::get_buffered_symbol(_version);
523 }
524 if (_location != nullptr) {
525 _location = ArchiveBuilder::get_buffered_symbol(_location);
526 }
527 JFR_ONLY(set_trace_id(0);) // re-init at runtime
528
529 ArchivePtrMarker::mark_pointer((address*)&_reads);
530 ArchivePtrMarker::mark_pointer((address*)&_version);
531 ArchivePtrMarker::mark_pointer((address*)&_location);
532 }
533
534 #ifndef PRODUCT
535 void ModuleEntry::verify_archived_module_entries() {
536 assert(_num_archived_module_entries == _num_inited_module_entries,
537 "%d ModuleEntries have been archived but %d of them have been properly initialized with archived java.lang.Module objects",
538 _num_archived_module_entries, _num_inited_module_entries);
539 }
540 #endif // PRODUCT
541
542 void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) {
543 assert(CDSConfig::is_using_archive(), "runtime only");
544 set_loader_data(loader_data);
545 set_reads(restore_growable_array(archived_reads()));
546 JFR_ONLY(INIT_ID(this);)
547 }
548
549 void ModuleEntry::restore_archived_oops(ClassLoaderData* loader_data) {
550 assert(CDSConfig::is_using_archive(), "runtime only");
551 Handle module_handle(Thread::current(), HeapShared::get_root(_archived_module_index, /*clear=*/true));
552 assert(module_handle.not_null(), "huh");
553 set_module_handle(loader_data->add_handle(module_handle));
554
555 // This was cleared to zero during dump time -- we didn't save the value
556 // because it may be affected by archive relocation.
557 java_lang_Module::set_module_entry(module_handle(), this);
558
559 assert(java_lang_Module::loader(module_handle()) == loader_data->class_loader(),
560 "must be set in dump time");
561
562 if (log_is_enabled(Info, aot, module)) {
563 ResourceMark rm;
564 LogStream ls(Log(aot, module)::info());
565 ls.print("Restored from archive: ");
566 print(&ls);
567 }
568 }
569
570 void ModuleEntry::clear_archived_oops() {
571 assert(CDSConfig::is_using_archive(), "runtime only");
572 HeapShared::clear_root(_archived_module_index);
573 }
574
575 static int compare_module_by_name(ModuleEntry* a, ModuleEntry* b) {
576 assert(a == b || a->name() != b->name(), "no duplicated names");
577 return a->name()->fast_compare(b->name());
578 }
579
580 void ModuleEntryTable::iterate_symbols(MetaspaceClosure* closure) {
581 auto syms = [&] (const SymbolHandle& key, ModuleEntry*& m) {
582 m->iterate_symbols(closure);
583 };
584 _table.iterate_all(syms);
585 }
586
587 Array<ModuleEntry*>* ModuleEntryTable::allocate_archived_entries() {
588 Array<ModuleEntry*>* archived_modules = ArchiveBuilder::new_rw_array<ModuleEntry*>(_table.number_of_entries());
589 int n = 0;
590 auto grab = [&] (const SymbolHandle& key, ModuleEntry*& m) {
591 archived_modules->at_put(n++, m);
592 };
593 _table.iterate_all(grab);
594
595 if (n > 1) {
596 // Always allocate in the same order to produce deterministic archive.
597 QuickSort::sort(archived_modules->data(), n, compare_module_by_name);
598 }
599 for (int i = 0; i < n; i++) {
600 archived_modules->at_put(i, archived_modules->at(i)->allocate_archived_entry());
601 ArchivePtrMarker::mark_pointer((address*)archived_modules->adr_at(i));
602 }
603 return archived_modules;
604 }
605
606 void ModuleEntryTable::init_archived_entries(Array<ModuleEntry*>* archived_modules) {
607 assert(CDSConfig::is_dumping_full_module_graph(), "sanity");
608 for (int i = 0; i < archived_modules->length(); i++) {
609 ModuleEntry* archived_entry = archived_modules->at(i);
610 archived_entry->init_as_archived_entry();
611 }
612 }
613
614 void ModuleEntryTable::load_archived_entries(ClassLoaderData* loader_data,
615 Array<ModuleEntry*>* archived_modules) {
616 assert(CDSConfig::is_using_archive(), "runtime only");
617
618 for (int i = 0; i < archived_modules->length(); i++) {
619 ModuleEntry* archived_entry = archived_modules->at(i);
620 archived_entry->load_from_archive(loader_data);
621 _table.put(archived_entry->name(), archived_entry);
622 }
623 }
624
625 void ModuleEntryTable::restore_archived_oops(ClassLoaderData* loader_data, Array<ModuleEntry*>* archived_modules) {
626 assert(CDSConfig::is_using_archive(), "runtime only");
627 for (int i = 0; i < archived_modules->length(); i++) {
628 ModuleEntry* archived_entry = archived_modules->at(i);
629 archived_entry->restore_archived_oops(loader_data);
630 }
631 }
632 #endif // INCLUDE_CDS_JAVA_HEAP
633
634 // Create an entry in the class loader's module_entry_table. It is the
635 // caller's responsibility to ensure that the entry has not already been
636 // created.
637 ModuleEntry* ModuleEntryTable::locked_create_entry(Handle module_handle,
638 bool is_open,
639 Symbol* module_name,
640 Symbol* module_version,
641 Symbol* module_location,
642 ClassLoaderData* loader_data) {
643 assert(module_name != nullptr, "ModuleEntryTable locked_create_entry should never be called for unnamed module.");
644 assert(Module_lock->owned_by_self(), "should have the Module_lock");
645 assert(lookup_only(module_name) == nullptr, "Module already exists");
646 ModuleEntry* entry = new ModuleEntry(module_handle, is_open, module_name,
647 module_version, module_location, loader_data);
648 bool created = _table.put(module_name, entry);
649 assert(created, "should be");
650 return entry;
651 }
652
653 // lookup_only by Symbol* to find a ModuleEntry.
654 ModuleEntry* ModuleEntryTable::lookup_only(Symbol* name) {
655 assert_locked_or_safepoint(Module_lock);
656 assert(name != nullptr, "name cannot be nullptr");
657 ModuleEntry** entry = _table.get(name);
658 return (entry == nullptr) ? nullptr : *entry;
659 }
660
661 // Remove dead modules from all other alive modules' reads list.
662 // This should only occur at class unloading.
663 void ModuleEntryTable::purge_all_module_reads() {
664 assert_locked_or_safepoint(Module_lock);
665 auto purge = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
666 entry->purge_reads();
667 };
668 _table.iterate_all(purge);
669 }
670
671 void ModuleEntryTable::finalize_javabase(Handle module_handle, Symbol* version, Symbol* location) {
672 assert(Module_lock->owned_by_self(), "should have the Module_lock");
673 ClassLoaderData* boot_loader_data = ClassLoaderData::the_null_class_loader_data();
674 ModuleEntryTable* module_table = boot_loader_data->modules();
675
676 assert(module_table != nullptr, "boot loader's ModuleEntryTable not defined");
677
678 if (module_handle.is_null()) {
679 fatal("Unable to finalize module definition for " JAVA_BASE_NAME);
680 }
681
682 // Set java.lang.Module, version and location for java.base
683 ModuleEntry* jb_module = javabase_moduleEntry();
684 assert(jb_module != nullptr, JAVA_BASE_NAME " ModuleEntry not defined");
685 jb_module->set_version(version);
686 jb_module->set_location(location);
687 // Once java.base's ModuleEntry _module field is set with the known
688 // java.lang.Module, java.base is considered "defined" to the VM.
689 jb_module->set_module_handle(boot_loader_data->add_handle(module_handle));
690
691 // Store pointer to the ModuleEntry for java.base in the java.lang.Module object.
692 java_lang_Module::set_module_entry(module_handle(), jb_module);
693 }
694
695 // Within java.lang.Class instances there is a java.lang.Module field that must
696 // be set with the defining module. During startup, prior to java.base's definition,
697 // classes needing their module field set are added to the fixup_module_list.
698 // Their module field is set once java.base's java.lang.Module is known to the VM.
699 void ModuleEntryTable::patch_javabase_entries(JavaThread* current, Handle module_handle) {
700 assert(!CDSConfig::is_using_aot_linked_classes(), "patching is not necessary with AOT-linked classes");
701
702 if (module_handle.is_null()) {
703 fatal("Unable to patch the module field of classes loaded prior to "
704 JAVA_BASE_NAME "'s definition, invalid java.lang.Module");
705 }
706
707 // Do the fixups for the basic primitive types
708 java_lang_Class::set_module(Universe::int_mirror(), module_handle());
709 java_lang_Class::set_module(Universe::float_mirror(), module_handle());
710 java_lang_Class::set_module(Universe::double_mirror(), module_handle());
711 java_lang_Class::set_module(Universe::byte_mirror(), module_handle());
712 java_lang_Class::set_module(Universe::bool_mirror(), module_handle());
713 java_lang_Class::set_module(Universe::char_mirror(), module_handle());
714 java_lang_Class::set_module(Universe::long_mirror(), module_handle());
715 java_lang_Class::set_module(Universe::short_mirror(), module_handle());
716 java_lang_Class::set_module(Universe::void_mirror(), module_handle());
717
718 // Do the fixups for classes that have already been created.
719 GrowableArray <Klass*>* list = java_lang_Class::fixup_module_field_list();
720 int list_length = list->length();
721 for (int i = 0; i < list_length; i++) {
722 Klass* k = list->at(i);
723 assert(k->is_klass(), "List should only hold classes");
724 #ifndef PRODUCT
725 if (HeapShared::is_a_test_class_in_unnamed_module(k)) {
726 // We allow -XX:ArchiveHeapTestClass to archive additional classes
727 // into the CDS heap, but these must be in the unnamed module.
728 ModuleEntry* unnamed_module = ClassLoaderData::the_null_class_loader_data()->unnamed_module();
729 Handle unnamed_module_handle(current, unnamed_module->module_oop());
730 java_lang_Class::fixup_module_field(k, unnamed_module_handle);
731 } else
732 #endif
733 {
734 java_lang_Class::fixup_module_field(k, module_handle);
735 }
736 k->class_loader_data()->dec_keep_alive_ref_count();
737 }
738
739 delete java_lang_Class::fixup_module_field_list();
740 java_lang_Class::set_fixup_module_field_list(nullptr);
741 }
742
743 void ModuleEntryTable::print(outputStream* st) {
744 ResourceMark rm;
745 auto printer = [&] (const SymbolHandle& name, ModuleEntry*& entry) {
746 entry->print(st);
747 };
748 st->print_cr("Module Entry Table (table_size=%d, entries=%d)",
749 _table.table_size(), _table.number_of_entries());
750 assert_locked_or_safepoint(Module_lock);
751 _table.iterate_all(printer);
752 }
753
754 void ModuleEntryTable::modules_do(void f(ModuleEntry*)) {
755 auto do_f = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
756 f(entry);
757 };
758 assert_lock_strong(Module_lock);
759 _table.iterate_all(do_f);
760 }
761
762 void ModuleEntryTable::modules_do(ModuleClosure* closure) {
763 auto do_f = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
764 closure->do_module(entry);
765 };
766 assert_lock_strong(Module_lock);
767 _table.iterate_all(do_f);
768 }
769
770 void ModuleEntry::print(outputStream* st) const {
771 st->print_cr("entry " PTR_FORMAT " name %s module " PTR_FORMAT " loader %s version %s location %s strict %s",
772 p2i(this),
773 name_as_C_string(),
774 p2i(module_oop()),
775 loader_data()->loader_name_and_id(),
776 version() != nullptr ? version()->as_C_string() : "nullptr",
777 location() != nullptr ? location()->as_C_string() : "nullptr",
778 BOOL_TO_STR(!can_read_all_unnamed()));
779 }
780
781 void ModuleEntryTable::verify() {
782 auto do_f = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
783 entry->verify();
784 };
785 assert_locked_or_safepoint(Module_lock);
786 _table.iterate_all(do_f);
787 }
788
789 void ModuleEntry::verify() {
790 guarantee(loader_data() != nullptr, "A module entry must be associated with a loader.");
791 }