src/hotspot/share/gc/z/zUnload.cpp
changeset 53921 a590b6107ab3
parent 53894 bf1133e7dfba
child 54567 224515275cf9
equal deleted inserted replaced
53920:7a72441858bb 53921:a590b6107ab3
    63     return _is_unloading;
    63     return _is_unloading;
    64   }
    64   }
    65 };
    65 };
    66 
    66 
    67 class ZIsUnloadingBehaviour : public IsUnloadingBehaviour {
    67 class ZIsUnloadingBehaviour : public IsUnloadingBehaviour {
    68 private:
       
    69   bool is_unloading(nmethod* nm) const {
       
    70     ZIsUnloadingOopClosure cl;
       
    71     nm->oops_do(&cl, true /* allow_zombie */);
       
    72     return cl.is_unloading();
       
    73   }
       
    74 
       
    75 public:
    68 public:
    76   virtual bool is_unloading(CompiledMethod* method) const {
    69   virtual bool is_unloading(CompiledMethod* method) const {
    77     nmethod* const nm = method->as_nmethod();
    70     nmethod* const nm = method->as_nmethod();
    78     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
    71     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
    79     if (lock == NULL) {
    72     ZLocker<ZReentrantLock> locker(lock);
    80       return is_unloading(nm);
    73     ZIsUnloadingOopClosure cl;
    81     } else {
    74     nm->oops_do(&cl, true /* allow_zombie */);
    82       ZLocker<ZReentrantLock> locker(lock);
    75     return cl.is_unloading();
    83       return is_unloading(nm);
       
    84     }
       
    85   }
    76   }
    86 };
    77 };
    87 
    78 
    88 class ZCompiledICProtectionBehaviour : public CompiledICProtectionBehaviour {
    79 class ZCompiledICProtectionBehaviour : public CompiledICProtectionBehaviour {
    89 public:
    80 public:
    90   virtual bool lock(CompiledMethod* method) {
    81   virtual bool lock(CompiledMethod* method) {
    91     nmethod* const nm = method->as_nmethod();
    82     nmethod* const nm = method->as_nmethod();
    92     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
    83     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
    93     if (lock != NULL) {
    84     lock->lock();
    94       lock->lock();
       
    95     }
       
    96     return true;
    85     return true;
    97   }
    86   }
    98 
    87 
    99   virtual void unlock(CompiledMethod* method) {
    88   virtual void unlock(CompiledMethod* method) {
   100     nmethod* const nm = method->as_nmethod();
    89     nmethod* const nm = method->as_nmethod();
   101     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
    90     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
   102     if (lock != NULL) {
    91     lock->unlock();
   103       lock->unlock();
       
   104     }
       
   105   }
    92   }
   106 
    93 
   107   virtual bool is_safe(CompiledMethod* method) {
    94   virtual bool is_safe(CompiledMethod* method) {
   108     if (SafepointSynchronize::is_at_safepoint()) {
    95     if (SafepointSynchronize::is_at_safepoint()) {
   109       return true;
    96       return true;
   110     }
    97     }
   111 
    98 
   112     nmethod* const nm = method->as_nmethod();
    99     nmethod* const nm = method->as_nmethod();
   113     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
   100     ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm);
   114     return lock == NULL || lock->is_owned();
   101     return lock->is_owned();
   115   }
   102   }
   116 };
   103 };
   117 
   104 
   118 ZUnload::ZUnload(ZWorkers* workers) :
   105 ZUnload::ZUnload(ZWorkers* workers) :
   119     _workers(workers) {
   106     _workers(workers) {