3131#include " classfile/classLoaderData.inline.hpp"
3232#include " classfile/javaClasses.inline.hpp"
3333#include " classfile/moduleEntry.hpp"
34+ #include " classfile/systemDictionary.hpp"
3435#include " jni.h"
3536#include " logging/log.hpp"
37+ #include " logging/logStream.hpp"
3638#include " memory/resourceArea.hpp"
3739#include " memory/universe.hpp"
3840#include " oops/oopHandle.inline.hpp"
@@ -386,20 +388,38 @@ typedef ResourceHashtable<
386388 AnyObj::C_HEAP> ArchivedModuleEntries;
387389static ArchivedModuleEntries* _archive_modules_entries = NULL ;
388390
391+ #ifndef PRODUCT
392+ static int _num_archived_module_entries = 0 ;
393+ static int _num_inited_module_entries = 0 ;
394+ #endif
395+
389396ModuleEntry* ModuleEntry::allocate_archived_entry () const {
390397 assert (is_named (), " unnamed packages/modules are not archived" );
391398 ModuleEntry* archived_entry = (ModuleEntry*)ArchiveBuilder::rw_region_alloc (sizeof (ModuleEntry));
392399 memcpy ((void *)archived_entry, (void *)this , sizeof (ModuleEntry));
400+ archived_entry->_archived_module_index = -1 ;
393401
394402 if (_archive_modules_entries == NULL ) {
395403 _archive_modules_entries = new (mtClass)ArchivedModuleEntries ();
396404 }
397405 assert (_archive_modules_entries->get (this ) == NULL , " Each ModuleEntry must not be shared across ModuleEntryTables" );
398406 _archive_modules_entries->put (this , archived_entry);
407+ DEBUG_ONLY (_num_archived_module_entries++);
399408
409+ if (log_is_enabled (Info, cds, module )) {
410+ ResourceMark rm;
411+ LogStream ls (Log (cds, module )::info ());
412+ ls.print (" Stored in archive: " );
413+ archived_entry->print (&ls);
414+ }
400415 return archived_entry;
401416}
402417
418+ bool ModuleEntry::has_been_archived () {
419+ assert (!ArchiveBuilder::current ()->is_in_buffer_space (this ), " must be called on original ModuleEntry" );
420+ return _archive_modules_entries->contains (this );
421+ }
422+
403423ModuleEntry* ModuleEntry::get_archived_entry (ModuleEntry* orig_entry) {
404424 ModuleEntry** ptr = _archive_modules_entries->get (orig_entry);
405425 assert (ptr != NULL && *ptr != NULL , " must have been allocated" );
@@ -467,27 +487,39 @@ void ModuleEntry::init_as_archived_entry() {
467487 ArchivePtrMarker::mark_pointer ((address*)&_location);
468488}
469489
470- void ModuleEntry::init_archived_oops ( ) {
490+ void ModuleEntry::update_oops_in_archived_module ( int root_oop_index ) {
471491 assert (DumpSharedSpaces, " static dump only" );
472- oop module_obj = module ();
473- if (module_obj != NULL ) {
474- oop m = HeapShared::find_archived_heap_object (module_obj);
475- assert (m != NULL , " sanity" );
476- _archived_module_index = HeapShared::append_root (m);
477- }
492+ assert (_archived_module_index == -1 , " must be set exactly once" );
493+ assert (root_oop_index >= 0 , " sanity" );
494+
495+ _archived_module_index = root_oop_index;
496+
478497 assert (shared_protection_domain () == NULL , " never set during -Xshare:dump" );
479498 // Clear handles and restore at run time. Handles cannot be archived.
480499 OopHandle null_handle;
481500 _module = null_handle;
501+
502+ // For verify_archived_module_entries()
503+ DEBUG_ONLY (_num_inited_module_entries++);
482504}
483505
506+ #ifndef PRODUCT
507+ void ModuleEntry::verify_archived_module_entries () {
508+ assert (_num_archived_module_entries == _num_inited_module_entries,
509+ " %d ModuleEntries have been archived but %d of them have been properly initialized with archived java.lang.Module objects" ,
510+ _num_archived_module_entries, _num_inited_module_entries);
511+ }
512+ #endif // PRODUCT
513+
484514void ModuleEntry::load_from_archive (ClassLoaderData* loader_data) {
515+ assert (UseSharedSpaces, " runtime only" );
485516 set_loader_data (loader_data);
486517 _reads = restore_growable_array ((Array<ModuleEntry*>*)_reads);
487518 JFR_ONLY (INIT_ID (this );)
488519}
489520
490521void ModuleEntry::restore_archived_oops (ClassLoaderData* loader_data) {
522+ assert (UseSharedSpaces, " runtime only" );
491523 Handle module_handle (Thread::current (), HeapShared::get_root (_archived_module_index, /* clear=*/ true ));
492524 assert (module_handle.not_null (), " huh" );
493525 set_module (loader_data->add_handle (module_handle));
@@ -496,12 +528,19 @@ void ModuleEntry::restore_archived_oops(ClassLoaderData* loader_data) {
496528 // because it may be affected by archive relocation.
497529 java_lang_Module::set_module_entry (module_handle (), this );
498530
499- if (loader_data->class_loader () != NULL ) {
500- java_lang_Module::set_loader (module_handle (), loader_data->class_loader ());
531+ assert (java_lang_Module::loader (module_handle ()) == loader_data->class_loader (),
532+ " must be set in dump time" );
533+
534+ if (log_is_enabled (Info, cds, module )) {
535+ ResourceMark rm;
536+ LogStream ls (Log (cds, module )::info ());
537+ ls.print (" Restored from archive: " );
538+ print (&ls);
501539 }
502540}
503541
504542void ModuleEntry::clear_archived_oops () {
543+ assert (UseSharedSpaces, " runtime only" );
505544 HeapShared::clear_root (_archived_module_index);
506545}
507546
@@ -544,14 +583,6 @@ void ModuleEntryTable::init_archived_entries(Array<ModuleEntry*>* archived_modul
544583 }
545584}
546585
547- void ModuleEntryTable::init_archived_oops (Array<ModuleEntry*>* archived_modules) {
548- assert (DumpSharedSpaces, " dump time only" );
549- for (int i = 0 ; i < archived_modules->length (); i++) {
550- ModuleEntry* archived_entry = archived_modules->at (i);
551- archived_entry->init_archived_oops ();
552- }
553- }
554-
555586void ModuleEntryTable::load_archived_entries (ClassLoaderData* loader_data,
556587 Array<ModuleEntry*>* archived_modules) {
557588 assert (UseSharedSpaces, " runtime only" );
0 commit comments