470 set_loader_data(loader_data);
471 _reads = read_archived_entry_array((Array<ModuleEntry*>*)_reads);
472 JFR_ONLY(INIT_ID(this);)
473 }
474
475 void ModuleEntry::restore_archive_oops(ClassLoaderData* loader_data) {
476 Handle module_handle(Thread::current(), HeapShared::materialize_archived_object(_archived_module_narrow_oop));
477 assert(module_handle.not_null(), "huh");
478 set_module(loader_data->add_handle(module_handle));
479
480 // This was cleared to zero during dump time -- we didn't save the value
481 // because it may be affected by archive relocation.
482 java_lang_Module::set_module_entry(module_handle(), this);
483
484 if (loader_data->class_loader() != NULL) {
485 java_lang_Module::set_loader(module_handle(), loader_data->class_loader());
486 }
487 }
488
489 static int compare_module_by_name(ModuleEntry* a, ModuleEntry* b) {
490 return a->name()->fast_compare(b->name());
491 }
492
493 Array<ModuleEntry*>* ModuleEntryTable::allocate_archived_entries() {
494 Array<ModuleEntry*>* archived_modules = MetaspaceShared::new_rw_array<ModuleEntry*>(number_of_entries());
495 int n = 0;
496 for (int i = 0; i < table_size(); ++i) {
497 for (ModuleEntry* m = bucket(i); m != NULL; m = m->next()) {
498 archived_modules->at_put(n++, m);
499 }
500 }
501 if (n > 1) {
502 // Always allocate in the same order to produce deterministic archive.
503 QuickSort::sort(archived_modules->data(), n, (_sort_Fn)compare_module_by_name, true);
504 }
505 for (int i = 0; i < n; i++) {
506 archived_modules->at_put(i, archived_modules->at(i)->allocate_archived_entry());
507 ArchivePtrMarker::mark_pointer((address*)archived_modules->adr_at(i));
508 }
509 return archived_modules;
|
470 set_loader_data(loader_data);
471 _reads = read_archived_entry_array((Array<ModuleEntry*>*)_reads);
472 JFR_ONLY(INIT_ID(this);)
473 }
474
475 void ModuleEntry::restore_archive_oops(ClassLoaderData* loader_data) {
476 Handle module_handle(Thread::current(), HeapShared::materialize_archived_object(_archived_module_narrow_oop));
477 assert(module_handle.not_null(), "huh");
478 set_module(loader_data->add_handle(module_handle));
479
480 // This was cleared to zero during dump time -- we didn't save the value
481 // because it may be affected by archive relocation.
482 java_lang_Module::set_module_entry(module_handle(), this);
483
484 if (loader_data->class_loader() != NULL) {
485 java_lang_Module::set_loader(module_handle(), loader_data->class_loader());
486 }
487 }
488
489 static int compare_module_by_name(ModuleEntry* a, ModuleEntry* b) {
490 assert(a == b || a->name() != b->name(), "no duplicated names");
491 return a->name()->fast_compare(b->name());
492 }
493
494 Array<ModuleEntry*>* ModuleEntryTable::allocate_archived_entries() {
495 Array<ModuleEntry*>* archived_modules = MetaspaceShared::new_rw_array<ModuleEntry*>(number_of_entries());
496 int n = 0;
497 for (int i = 0; i < table_size(); ++i) {
498 for (ModuleEntry* m = bucket(i); m != NULL; m = m->next()) {
499 archived_modules->at_put(n++, m);
500 }
501 }
502 if (n > 1) {
503 // Always allocate in the same order to produce deterministic archive.
504 QuickSort::sort(archived_modules->data(), n, (_sort_Fn)compare_module_by_name, true);
505 }
506 for (int i = 0; i < n; i++) {
507 archived_modules->at_put(i, archived_modules->at(i)->allocate_archived_entry());
508 ArchivePtrMarker::mark_pointer((address*)archived_modules->adr_at(i));
509 }
510 return archived_modules;
|