diff --git a/src/hotspot/share/cds/archiveUtils.hpp b/src/hotspot/share/cds/archiveUtils.hpp index 128fdc4d33a..5387d714a41 100644 --- a/src/hotspot/share/cds/archiveUtils.hpp +++ b/src/hotspot/share/cds/archiveUtils.hpp @@ -371,6 +371,7 @@ class ArchiveWorkerShutdownTask : public ArchiveWorkerTask { // the normal GC worker pool. class ArchiveWorkers { friend class ArchiveWorkerThread; + friend class ArchiveWorkersMark; private: // Target number of chunks per worker. This should be large enough to even // out work imbalance, and small enough to keep bookkeeping overheads low. @@ -404,12 +405,23 @@ class ArchiveWorkers { bool is_parallel(); ArchiveWorkers(); + void initialize(); + void shutdown(); public: static ArchiveWorkers* workers() { return &_workers; } - void initialize(); - void shutdown(); void run_task(ArchiveWorkerTask* task); }; +class ArchiveWorkersMark : public StackObj { +public: + ArchiveWorkersMark() { + ArchiveWorkers::workers()->initialize(); + } + ~ArchiveWorkersMark() { + ArchiveWorkers::workers()->shutdown(); + } +}; + + #endif // SHARE_CDS_ARCHIVEUTILS_HPP diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp index a8c10e38577..4f10938a73d 100644 --- a/src/hotspot/share/cds/metaspaceShared.cpp +++ b/src/hotspot/share/cds/metaspaceShared.cpp @@ -1088,8 +1088,7 @@ void MetaspaceShared::initialize_runtime_shared_and_meta_spaces() { assert(CDSConfig::is_using_archive(), "Must be called when UseSharedSpaces is enabled"); MapArchiveResult result = MAP_ARCHIVE_OTHER_FAILURE; - // We are about to open the archives. Initialize workers now. - ArchiveWorkers::workers()->initialize(); + ArchiveWorkersMark workers_mark; FileMapInfo* static_mapinfo = open_static_archive(); FileMapInfo* dynamic_mapinfo = nullptr; @@ -1682,9 +1681,6 @@ void MetaspaceShared::initialize_shared_spaces() { dynamic_mapinfo->unmap_region(MetaspaceShared::bm); } - // Archive was fully read. Workers are no longer needed. - ArchiveWorkers::workers()->shutdown(); - LogStreamHandle(Info, cds) lsh; if (lsh.is_enabled()) { lsh.print("Using AOT-linked classes: %s (static archive: %s aot-linked classes", diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index d2338cd74d0..c9c7ae8e4c3 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -441,11 +441,6 @@ void before_exit(JavaThread* thread, bool halt) { #if INCLUDE_CDS ClassListWriter::write_resolved_constants(); - - // Initiate Archive Workers shutdown. These workers are likely already - // shut down, but we need to make sure they really are. Otherwise, workers - // would fail hard on broken semaphores. - ArchiveWorkers::workers()->shutdown(); #endif // Hang forever on exit if we're reporting an error.