src/hotspot/share/gc/shared/parallelCleaning.cpp
changeset 54669 ad45b3802d4e
parent 54122 4b1426ed1c44
child 57510 4db4d0d14390
equal deleted inserted replaced
54668:0bda2308eded 54669:ad45b3802d4e
    28 #include "code/codeCache.hpp"
    28 #include "code/codeCache.hpp"
    29 #include "gc/shared/parallelCleaning.hpp"
    29 #include "gc/shared/parallelCleaning.hpp"
    30 #include "logging/log.hpp"
    30 #include "logging/log.hpp"
    31 #include "memory/resourceArea.hpp"
    31 #include "memory/resourceArea.hpp"
    32 #include "logging/log.hpp"
    32 #include "logging/log.hpp"
       
    33 #if INCLUDE_JVMCI
       
    34 #include "jvmci/jvmci.hpp"
       
    35 #endif
    33 
    36 
    34 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive,
    37 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive,
    35                                                  OopClosure* keep_alive,
    38                                                  OopClosure* keep_alive,
    36                                                  bool resize_table) :
    39                                                  bool resize_table) :
    37   AbstractGangTask("String Dedup Cleaning"),
    40   AbstractGangTask("String Dedup Cleaning"),
   156   while ((klass = claim_next_klass()) != NULL) {
   159   while ((klass = claim_next_klass()) != NULL) {
   157     clean_klass(klass);
   160     clean_klass(klass);
   158   }
   161   }
   159 }
   162 }
   160 
   163 
       
   164 #if INCLUDE_JVMCI
       
   165 JVMCICleaningTask::JVMCICleaningTask() :
       
   166   _cleaning_claimed(0) {
       
   167 }
       
   168 
       
   169 bool JVMCICleaningTask::claim_cleaning_task() {
       
   170   if (_cleaning_claimed) {
       
   171     return false;
       
   172   }
       
   173 
       
   174   return Atomic::cmpxchg(1, &_cleaning_claimed, 0) == 0;
       
   175 }
       
   176 
       
   177 void JVMCICleaningTask::work(bool unloading_occurred) {
       
   178   // One worker will clean JVMCI metadata handles.
       
   179   if (unloading_occurred && EnableJVMCI && claim_cleaning_task()) {
       
   180     JVMCI::do_unloading(unloading_occurred);
       
   181   }
       
   182 }
       
   183 #endif // INCLUDE_JVMCI
       
   184 
   161 ParallelCleaningTask::ParallelCleaningTask(BoolObjectClosure* is_alive,
   185 ParallelCleaningTask::ParallelCleaningTask(BoolObjectClosure* is_alive,
   162                                            uint num_workers,
   186                                            uint num_workers,
   163                                            bool unloading_occurred,
   187                                            bool unloading_occurred,
   164                                            bool resize_dedup_table) :
   188                                            bool resize_dedup_table) :
   165   AbstractGangTask("Parallel Cleaning"),
   189   AbstractGangTask("Parallel Cleaning"),
   166   _unloading_occurred(unloading_occurred),
   190   _unloading_occurred(unloading_occurred),
   167   _string_dedup_task(is_alive, NULL, resize_dedup_table),
   191   _string_dedup_task(is_alive, NULL, resize_dedup_table),
   168   _code_cache_task(num_workers, is_alive, unloading_occurred),
   192   _code_cache_task(num_workers, is_alive, unloading_occurred),
       
   193   JVMCI_ONLY(_jvmci_cleaning_task() COMMA)
   169   _klass_cleaning_task() {
   194   _klass_cleaning_task() {
   170 }
   195 }
   171 
   196 
   172 // The parallel work done by all worker threads.
   197 // The parallel work done by all worker threads.
   173 void ParallelCleaningTask::work(uint worker_id) {
   198 void ParallelCleaningTask::work(uint worker_id) {
       
   199   // Clean JVMCI metadata handles.
       
   200   // Execute this task first because it is serial task.
       
   201   JVMCI_ONLY(_jvmci_cleaning_task.work(_unloading_occurred);)
       
   202 
   174   // Do first pass of code cache cleaning.
   203   // Do first pass of code cache cleaning.
   175   _code_cache_task.work(worker_id);
   204   _code_cache_task.work(worker_id);
   176 
   205 
   177   // Clean the string dedup data structures.
   206   // Clean the string dedup data structures.
   178   _string_dedup_task.work(worker_id);
   207   _string_dedup_task.work(worker_id);