src/hotspot/share/gc/shared/parallelCleaning.cpp
changeset 57510 4db4d0d14390
parent 54669 ad45b3802d4e
child 59252 623722a6aeb9
equal deleted inserted replaced
57509:c64a2df9dc7d 57510:4db4d0d14390
    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
       
    36 
    33 
    37 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive,
    34 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive,
    38                                                  OopClosure* keep_alive,
    35                                                  OopClosure* keep_alive,
    39                                                  bool resize_table) :
    36                                                  bool resize_table) :
    40   AbstractGangTask("String Dedup Cleaning"),
    37   AbstractGangTask("String Dedup Cleaning"),
   158   InstanceKlass* klass;
   155   InstanceKlass* klass;
   159   while ((klass = claim_next_klass()) != NULL) {
   156   while ((klass = claim_next_klass()) != NULL) {
   160     clean_klass(klass);
   157     clean_klass(klass);
   161   }
   158   }
   162 }
   159 }
   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 
       
   185 ParallelCleaningTask::ParallelCleaningTask(BoolObjectClosure* is_alive,
       
   186                                            uint num_workers,
       
   187                                            bool unloading_occurred,
       
   188                                            bool resize_dedup_table) :
       
   189   AbstractGangTask("Parallel Cleaning"),
       
   190   _unloading_occurred(unloading_occurred),
       
   191   _string_dedup_task(is_alive, NULL, resize_dedup_table),
       
   192   _code_cache_task(num_workers, is_alive, unloading_occurred),
       
   193   JVMCI_ONLY(_jvmci_cleaning_task() COMMA)
       
   194   _klass_cleaning_task() {
       
   195 }
       
   196 
       
   197 // The parallel work done by all worker threads.
       
   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 
       
   203   // Do first pass of code cache cleaning.
       
   204   _code_cache_task.work(worker_id);
       
   205 
       
   206   // Clean the string dedup data structures.
       
   207   _string_dedup_task.work(worker_id);
       
   208 
       
   209   // Clean all klasses that were not unloaded.
       
   210   // The weak metadata in klass doesn't need to be
       
   211   // processed if there was no unloading.
       
   212   if (_unloading_occurred) {
       
   213     _klass_cleaning_task.work();
       
   214   }
       
   215 }