< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp

Print this page
rev 59304 : 8245124: Shenandoah: optimize code root evacuation/update during concurrent class unloading


  37 ShenandoahReentrantLock* ShenandoahNMethod::lock() {
  38   return &_lock;
  39 }
  40 
  41 int ShenandoahNMethod::oop_count() const {
  42   return _oops_count + static_cast<int>(nm()->oops_end() - nm()->oops_begin());
  43 }
  44 
  45 bool ShenandoahNMethod::has_oops() const {
  46   return oop_count() > 0;
  47 }
  48 
  49 void ShenandoahNMethod::mark_unregistered() {
  50   _unregistered = true;
  51 }
  52 
  53 bool ShenandoahNMethod::is_unregistered() const {
  54   return _unregistered;
  55 }
  56 























  57 void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
  58   if (!ShenandoahConcurrentRoots::can_do_concurrent_class_unloading()) {
  59     return;
  60   }
  61 
  62   BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
  63   assert(bs != NULL, "Sanity");
  64   if (bs->is_armed(nm)) {
  65     bs->disarm(nm);
  66   }
  67 }
  68 
  69 ShenandoahNMethod* ShenandoahNMethod::gc_data(nmethod* nm) {
  70   return nm->gc_data<ShenandoahNMethod>();
  71 }
  72 
  73 void ShenandoahNMethod::attach_gc_data(nmethod* nm, ShenandoahNMethod* gc_data) {
  74   nm->set_gc_data<ShenandoahNMethod>(gc_data);
  75 }
  76 




  37 ShenandoahReentrantLock* ShenandoahNMethod::lock() {
  38   return &_lock;
  39 }
  40 
  41 int ShenandoahNMethod::oop_count() const {
  42   return _oops_count + static_cast<int>(nm()->oops_end() - nm()->oops_begin());
  43 }
  44 
  45 bool ShenandoahNMethod::has_oops() const {
  46   return oop_count() > 0;
  47 }
  48 
  49 void ShenandoahNMethod::mark_unregistered() {
  50   _unregistered = true;
  51 }
  52 
  53 bool ShenandoahNMethod::is_unregistered() const {
  54   return _unregistered;
  55 }
  56 
  57 void ShenandoahNMethod::oops_do(OopClosure* oops, bool fix_relocations) {
  58   for (int c = 0; c < _oops_count; c ++) {
  59     oops->do_oop(_oops[c]);
  60   }
  61 
  62   oop* const begin = _nm->oops_begin();
  63   oop* const end = _nm->oops_end();
  64   for (oop* p = begin; p < end; p++) {
  65     if (*p != Universe::non_oop_word()) {
  66       oops->do_oop(p);
  67     }
  68   }
  69 
  70   if (fix_relocations && _has_non_immed_oops) {
  71     _nm->fix_oop_relocations();
  72   }
  73 }
  74 
  75 void ShenandoahNMethod::heal_nmethod_metadata(ShenandoahNMethod* nmethod_data) {
  76   ShenandoahEvacuateUpdateRootsClosure<> cl;
  77   nmethod_data->oops_do(&cl, true /*fix relocation*/);
  78 }
  79 
  80 void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
  81   if (!ShenandoahConcurrentRoots::can_do_concurrent_class_unloading()) {
  82     return;
  83   }
  84 
  85   BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
  86   assert(bs != NULL, "Sanity");
  87   if (bs->is_armed(nm)) {
  88     bs->disarm(nm);
  89   }
  90 }
  91 
  92 ShenandoahNMethod* ShenandoahNMethod::gc_data(nmethod* nm) {
  93   return nm->gc_data<ShenandoahNMethod>();
  94 }
  95 
  96 void ShenandoahNMethod::attach_gc_data(nmethod* nm, ShenandoahNMethod* gc_data) {
  97   nm->set_gc_data<ShenandoahNMethod>(gc_data);
  98 }
  99 


< prev index next >