< prev index next >

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

Print this page
rev 8203 : imported patch remove_config


  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   if (ReferenceProcessor::pending_list_uses_discovered_field()) {
  59     T next_oop  = oopDesc::load_heap_oop(next_addr);
  60     // Treat discovered as normal oop, if ref is not "active" (next non-NULL)
  61     if (!oopDesc::is_null(next_oop) && contains(disc_addr)) {
  62       // i.e. ref is not "active"
  63       debug_only(
  64         if(TraceReferenceGC && PrintGCDetails) {
  65           gclog_or_tty->print_cr("   Process discovered as normal "
  66                                  PTR_FORMAT, p2i(disc_addr));
  67         }
  68       )
  69       Devirtualizer<nv>::do_oop(closure, disc_addr);
  70     }
  71   } else {
  72     // In the case of older JDKs which do not use the discovered field for
  73     // the pending list, an inactive ref (next != NULL) must always have a
  74     // NULL discovered field.
  75     debug_only(
  76       T next_oop = oopDesc::load_heap_oop(next_addr);
  77       T disc_oop = oopDesc::load_heap_oop(disc_addr);
  78       assert(oopDesc::is_null(next_oop) || oopDesc::is_null(disc_oop),
  79            err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL"
  80                    "discovered field", p2i(obj)));
  81     )
  82   }
  83   // treat next as normal oop
  84   if (contains(next_addr)) {
  85     Devirtualizer<nv>::do_oop(closure, next_addr);
  86   }
  87 }
  88 
  89 class AlwaysContains {
  90  public:
  91   template <typename T> bool operator()(T* p) const { return true; }
  92 };
  93 
  94 template <bool nv, class OopClosureType>
  95 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure) {
  96   AlwaysContains always_contains;
  97   if (UseCompressedOops) {
  98     oop_oop_iterate_ref_processing_specialized<nv, narrowOop>(obj, closure, always_contains);
  99   } else {
 100     oop_oop_iterate_ref_processing_specialized<nv, oop>(obj, closure, always_contains);
 101   }




  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   }
  70   // treat next as normal oop
  71   if (contains(next_addr)) {
  72     Devirtualizer<nv>::do_oop(closure, next_addr);
  73   }
  74 }
  75 
  76 class AlwaysContains {
  77  public:
  78   template <typename T> bool operator()(T* p) const { return true; }
  79 };
  80 
  81 template <bool nv, class OopClosureType>
  82 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure) {
  83   AlwaysContains always_contains;
  84   if (UseCompressedOops) {
  85     oop_oop_iterate_ref_processing_specialized<nv, narrowOop>(obj, closure, always_contains);
  86   } else {
  87     oop_oop_iterate_ref_processing_specialized<nv, oop>(obj, closure, always_contains);
  88   }


< prev index next >