--- a/src/hotspot/share/gc/shared/parallelCleaning.cpp Wed May 01 12:41:26 2019 -0400
+++ b/src/hotspot/share/gc/shared/parallelCleaning.cpp Wed May 01 12:31:29 2019 -0700
@@ -30,6 +30,9 @@
#include "logging/log.hpp"
#include "memory/resourceArea.hpp"
#include "logging/log.hpp"
+#if INCLUDE_JVMCI
+#include "jvmci/jvmci.hpp"
+#endif
StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive,
OopClosure* keep_alive,
@@ -158,6 +161,27 @@
}
}
+#if INCLUDE_JVMCI
+JVMCICleaningTask::JVMCICleaningTask() :
+ _cleaning_claimed(0) {
+}
+
+bool JVMCICleaningTask::claim_cleaning_task() {
+ if (_cleaning_claimed) {
+ return false;
+ }
+
+ return Atomic::cmpxchg(1, &_cleaning_claimed, 0) == 0;
+}
+
+void JVMCICleaningTask::work(bool unloading_occurred) {
+ // One worker will clean JVMCI metadata handles.
+ if (unloading_occurred && EnableJVMCI && claim_cleaning_task()) {
+ JVMCI::do_unloading(unloading_occurred);
+ }
+}
+#endif // INCLUDE_JVMCI
+
ParallelCleaningTask::ParallelCleaningTask(BoolObjectClosure* is_alive,
uint num_workers,
bool unloading_occurred,
@@ -166,11 +190,16 @@
_unloading_occurred(unloading_occurred),
_string_dedup_task(is_alive, NULL, resize_dedup_table),
_code_cache_task(num_workers, is_alive, unloading_occurred),
+ JVMCI_ONLY(_jvmci_cleaning_task() COMMA)
_klass_cleaning_task() {
}
// The parallel work done by all worker threads.
void ParallelCleaningTask::work(uint worker_id) {
+ // Clean JVMCI metadata handles.
+ // Execute this task first because it is serial task.
+ JVMCI_ONLY(_jvmci_cleaning_task.work(_unloading_occurred);)
+
// Do first pass of code cache cleaning.
_code_cache_task.work(worker_id);