< prev index next >

src/share/vm/oops/instanceRefKlass.inline.hpp

Print this page
rev 8961 : [mq]: diff-shenandoah.patch


  29 #include "gc/shared/referenceProcessor.hpp"
  30 #include "oops/instanceKlass.inline.hpp"
  31 #include "oops/instanceRefKlass.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "utilities/debug.hpp"
  34 #include "utilities/globalDefinitions.hpp"
  35 #include "utilities/macros.hpp"
  36 
  37 template <bool nv, typename T, class OopClosureType, class Contains>
  38 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
  39   T* disc_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
  40   if (closure->apply_to_weak_ref_discovered_field()) {
  41     Devirtualizer<nv>::do_oop(closure, disc_addr);
  42   }
  43 
  44   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
  45   T heap_oop = oopDesc::load_heap_oop(referent_addr);
  46   ReferenceProcessor* rp = closure->_ref_processor;
  47   if (!oopDesc::is_null(heap_oop)) {
  48     oop referent = oopDesc::decode_heap_oop_not_null(heap_oop);
  49     if (!referent->is_gc_marked() && (rp != NULL) &&



  50         rp->discover_reference(obj, reference_type())) {
  51       return;
  52     } else if (contains(referent_addr)) {
  53       // treat referent as normal oop
  54       Devirtualizer<nv>::do_oop(closure, referent_addr);
  55     }
  56   }
  57   T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
  58   T next_oop  = oopDesc::load_heap_oop(next_addr);
  59   // Treat discovered as normal oop, if ref is not "active" (next non-NULL)
  60   if (!oopDesc::is_null(next_oop) && contains(disc_addr)) {
  61     // i.e. ref is not "active"
  62     debug_only(
  63       if(TraceReferenceGC && PrintGCDetails) {
  64         gclog_or_tty->print_cr("   Process discovered as normal "
  65                                PTR_FORMAT, p2i(disc_addr));
  66       }
  67     )
  68     Devirtualizer<nv>::do_oop(closure, disc_addr);
  69   }




  29 #include "gc/shared/referenceProcessor.hpp"
  30 #include "oops/instanceKlass.inline.hpp"
  31 #include "oops/instanceRefKlass.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "utilities/debug.hpp"
  34 #include "utilities/globalDefinitions.hpp"
  35 #include "utilities/macros.hpp"
  36 
  37 template <bool nv, typename T, class OopClosureType, class Contains>
  38 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
  39   T* disc_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
  40   if (closure->apply_to_weak_ref_discovered_field()) {
  41     Devirtualizer<nv>::do_oop(closure, disc_addr);
  42   }
  43 
  44   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
  45   T heap_oop = oopDesc::load_heap_oop(referent_addr);
  46   ReferenceProcessor* rp = closure->_ref_processor;
  47   if (!oopDesc::is_null(heap_oop)) {
  48     oop referent = oopDesc::decode_heap_oop_not_null(heap_oop);
  49     if (UseShenandoahGC) {
  50       referent = ShenandoahBarrierSet::resolve_and_update_oop_static(referent_addr, referent);
  51     }
  52     if ((UseShenandoahGC || !referent->is_gc_marked()) && (rp != NULL) &&
  53         rp->discover_reference(obj, reference_type())) {
  54       return;
  55     } else if (contains(referent_addr)) {
  56       // treat referent as normal oop
  57       Devirtualizer<nv>::do_oop(closure, referent_addr);
  58     }
  59   }
  60   T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
  61   T next_oop  = oopDesc::load_heap_oop(next_addr);
  62   // Treat discovered as normal oop, if ref is not "active" (next non-NULL)
  63   if (!oopDesc::is_null(next_oop) && contains(disc_addr)) {
  64     // i.e. ref is not "active"
  65     debug_only(
  66       if(TraceReferenceGC && PrintGCDetails) {
  67         gclog_or_tty->print_cr("   Process discovered as normal "
  68                                PTR_FORMAT, p2i(disc_addr));
  69       }
  70     )
  71     Devirtualizer<nv>::do_oop(closure, disc_addr);
  72   }


< prev index next >