< prev index next >

src/hotspot/share/cds/dynamicArchive.cpp

Print this page
*** 29,10 ***
--- 29,12 ---
  #include "cds/archiveHeapWriter.hpp"
  #include "cds/archiveUtils.inline.hpp"
  #include "cds/cds_globals.hpp"
  #include "cds/cdsConfig.hpp"
  #include "cds/dynamicArchive.hpp"
+ #include "cds/lambdaFormInvokers.hpp"
+ #include "cds/metaspaceShared.hpp"
  #include "cds/regeneratedClasses.hpp"
  #include "classfile/classLoader.hpp"
  #include "classfile/classLoaderData.inline.hpp"
  #include "classfile/symbolTable.hpp"
  #include "classfile/systemDictionaryShared.hpp"

*** 491,10 ***
--- 493,24 ---
  #undef __THEMSG
      CDSConfig::disable_dumping_dynamic_archive();
    }
  }
  
+ void DynamicArchive::dump_impl(bool jcmd_request, const char* archive_name, TRAPS) {
+   MetaspaceShared::link_shared_classes(CHECK);
+   if (!jcmd_request && CDSConfig::is_dumping_regenerated_lambdaform_invokers()) {
+     LambdaFormInvokers::regenerate_holder_classes(CHECK);
+   } else {
+     // Make sure we have at least one class in the dynamic archive
+     TempNewSymbol class_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$DummyForDynamicArchive");
+     SystemDictionary::resolve_or_null(class_name, Handle(), CHECK);
+   }
+ 
+   VM_PopulateDynamicDumpSharedSpace op(archive_name);
+   VMThread::execute(&op);
+ }
+ 
  void DynamicArchive::dump_at_exit(JavaThread* current, const char* archive_name) {
    ExceptionMark em(current);
    ResourceMark rm(current);
    CDSConfig::DumperThreadMark dumper_thread_mark(current);
  

*** 503,36 ***
    }
  
    log_info(cds, dynamic)("Preparing for dynamic dump at exit in thread %s", current->name());
  
    JavaThread* THREAD = current; // For TRAPS processing related to link_shared_classes
!   MetaspaceShared::link_shared_classes(false/*not from jcmd*/, THREAD);
!   if (!HAS_PENDING_EXCEPTION) {
!     VM_PopulateDynamicDumpSharedSpace op(archive_name);
!     VMThread::execute(&op);
!     return;
    }
- 
-   // One of the prepatory steps failed
-   oop ex = current->pending_exception();
-   log_error(cds)("Dynamic dump has failed");
-   log_error(cds)("%s: %s", ex->klass()->external_name(),
-                  java_lang_String::as_utf8_string(java_lang_Throwable::message(ex)));
-   CLEAR_PENDING_EXCEPTION;
-   CDSConfig::disable_dumping_dynamic_archive();  // Just for good measure
  }
  
  // This is called by "jcmd VM.cds dynamic_dump"
  void DynamicArchive::dump_for_jcmd(const char* archive_name, TRAPS) {
    CDSConfig::DumperThreadMark dumper_thread_mark(THREAD);
    assert(CDSConfig::is_using_archive() && RecordDynamicDumpInfo, "already checked in arguments.cpp");
    assert(ArchiveClassesAtExit == nullptr, "already checked in arguments.cpp");
    assert(CDSConfig::is_dumping_dynamic_archive(), "already checked by check_for_dynamic_dump() during VM startup");
!   MetaspaceShared::link_shared_classes(true/*from jcmd*/, CHECK);
-   // copy shared path table to saved.
-   VM_PopulateDynamicDumpSharedSpace op(archive_name);
-   VMThread::execute(&op);
  }
  
  bool DynamicArchive::validate(FileMapInfo* dynamic_info) {
    assert(!dynamic_info->is_static(), "must be");
    // Check if the recorded base archive matches with the current one
--- 519,29 ---
    }
  
    log_info(cds, dynamic)("Preparing for dynamic dump at exit in thread %s", current->name());
  
    JavaThread* THREAD = current; // For TRAPS processing related to link_shared_classes
!   dump_impl(/*jcmd_request=*/false, archive_name, THREAD);
!   if (HAS_PENDING_EXCEPTION) {
!     // One of the prepatory steps failed
!     oop ex = current->pending_exception();
!     log_error(cds)("Dynamic dump has failed");
+     log_error(cds)("%s: %s", ex->klass()->external_name(),
+                    java_lang_String::as_utf8_string(java_lang_Throwable::message(ex)));
+     CLEAR_PENDING_EXCEPTION;
+     CDSConfig::disable_dumping_dynamic_archive();  // Just for good measure
    }
  }
  
  // This is called by "jcmd VM.cds dynamic_dump"
  void DynamicArchive::dump_for_jcmd(const char* archive_name, TRAPS) {
    CDSConfig::DumperThreadMark dumper_thread_mark(THREAD);
    assert(CDSConfig::is_using_archive() && RecordDynamicDumpInfo, "already checked in arguments.cpp");
    assert(ArchiveClassesAtExit == nullptr, "already checked in arguments.cpp");
    assert(CDSConfig::is_dumping_dynamic_archive(), "already checked by check_for_dynamic_dump() during VM startup");
!   dump_impl(/*jcmd_request=*/true, archive_name, CHECK);
  }
  
  bool DynamicArchive::validate(FileMapInfo* dynamic_info) {
    assert(!dynamic_info->is_static(), "must be");
    // Check if the recorded base archive matches with the current one
< prev index next >