< prev index next >

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

Print this page
rev 12851 : 8138737: Remove oop_ms_adjust_pointers and use oop_iterate instead
Reviewed-by:
rev 12852 : [mq]: 8138737-remove-oop-ms-adjust-kbarrett-rev1
rev 12853 : [mq]: 8138737-remove-oop-ms-adjust-stefank-rev1


  38 template <bool nv, typename T, class OopClosureType, class Contains>
  39 void InstanceRefKlass::do_referent(oop obj, OopClosureType* closure, Contains& contains) {
  40   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
  41   if (contains(referent_addr)) {
  42     Devirtualizer<nv>::do_oop(closure, referent_addr);
  43   }
  44 }
  45 
  46 template <bool nv, typename T, class OopClosureType, class Contains>
  47 void InstanceRefKlass::do_next(oop obj, OopClosureType* closure, Contains& contains) {
  48   T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
  49   if (contains(next_addr)) {
  50     Devirtualizer<nv>::do_oop(closure, next_addr);
  51   }
  52 }
  53 
  54 template <bool nv, typename T, class OopClosureType, class Contains>
  55 void InstanceRefKlass::do_discovered(oop obj, OopClosureType* closure, Contains& contains) {
  56   T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
  57   if (contains(discovered_addr)) {
  58     log_develop_trace(gc, ref)("   Process discovered as normal " PTR_FORMAT, p2i(discovered_addr));
  59     Devirtualizer<nv>::do_oop(closure, discovered_addr);
  60   }
  61 }
  62 
  63 template <typename T, class OopClosureType>
  64 bool InstanceRefKlass::try_discover(oop obj, ReferenceType type, OopClosureType* closure) {
  65   ReferenceProcessor* rp = closure->ref_processor();
  66   if (rp != NULL) {
  67     T referent_oop = oopDesc::load_heap_oop((T*)java_lang_ref_Reference::referent_addr(obj));
  68     if (!oopDesc::is_null(referent_oop)) {
  69       oop referent = oopDesc::decode_heap_oop_not_null(referent_oop);
  70       if (!referent->is_gc_marked()) {
  71         // Only try to discover if not yet marked.
  72         return rp->discover_reference(obj, type);
  73       }
  74     }
  75   }
  76   return false;
  77 }
  78 


  91   }
  92 
  93   // Treat referent as normal oop.
  94   do_referent<nv, T>(obj, closure, contains);
  95 
  96   // Treat discovered as normal oop, if ref is not "active" (next non-NULL).
  97   T next_oop  = oopDesc::load_heap_oop((T*)java_lang_ref_Reference::next_addr(obj));
  98   if (!oopDesc::is_null(next_oop)) {
  99     do_discovered<nv, T>(obj, closure, contains);
 100   }
 101 
 102   // Treat next as normal oop.
 103   do_next<nv, T>(obj, closure, contains);
 104 }
 105 
 106 template <bool nv, typename T, class OopClosureType, class Contains>
 107 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) {
 108   do_referent<nv, T>(obj, closure, contains);
 109   do_discovered<nv, T>(obj, closure, contains);
 110   do_next<nv, T>(obj, closure, contains);

 111   trace_reference_gc("InstanceRefKlass::oop_oop_iterate_fields()",
 112                      obj,
 113                      (T*)java_lang_ref_Reference::referent_addr(obj),
 114                      (T*)java_lang_ref_Reference::next_addr(obj),
 115                      (T*)java_lang_ref_Reference::discovered_addr(obj));
 116 }
 117 
 118 template <bool nv, typename T, class OopClosureType, class Contains>
 119 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
 120   switch (closure->reference_iteration_mode()) {
 121     case ExtendedOopClosure::DO_DISCOVERY:
 122       oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
 123       break;
 124     case ExtendedOopClosure::DO_FIELDS:
 125       oop_oop_iterate_fields<nv, T>(obj, closure, contains);
 126       break;
 127     default:
 128       ShouldNotReachHere();
 129   }
 130 }




  38 template <bool nv, typename T, class OopClosureType, class Contains>
  39 void InstanceRefKlass::do_referent(oop obj, OopClosureType* closure, Contains& contains) {
  40   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
  41   if (contains(referent_addr)) {
  42     Devirtualizer<nv>::do_oop(closure, referent_addr);
  43   }
  44 }
  45 
  46 template <bool nv, typename T, class OopClosureType, class Contains>
  47 void InstanceRefKlass::do_next(oop obj, OopClosureType* closure, Contains& contains) {
  48   T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
  49   if (contains(next_addr)) {
  50     Devirtualizer<nv>::do_oop(closure, next_addr);
  51   }
  52 }
  53 
  54 template <bool nv, typename T, class OopClosureType, class Contains>
  55 void InstanceRefKlass::do_discovered(oop obj, OopClosureType* closure, Contains& contains) {
  56   T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
  57   if (contains(discovered_addr)) {

  58     Devirtualizer<nv>::do_oop(closure, discovered_addr);
  59   }
  60 }
  61 
  62 template <typename T, class OopClosureType>
  63 bool InstanceRefKlass::try_discover(oop obj, ReferenceType type, OopClosureType* closure) {
  64   ReferenceProcessor* rp = closure->ref_processor();
  65   if (rp != NULL) {
  66     T referent_oop = oopDesc::load_heap_oop((T*)java_lang_ref_Reference::referent_addr(obj));
  67     if (!oopDesc::is_null(referent_oop)) {
  68       oop referent = oopDesc::decode_heap_oop_not_null(referent_oop);
  69       if (!referent->is_gc_marked()) {
  70         // Only try to discover if not yet marked.
  71         return rp->discover_reference(obj, type);
  72       }
  73     }
  74   }
  75   return false;
  76 }
  77 


  90   }
  91 
  92   // Treat referent as normal oop.
  93   do_referent<nv, T>(obj, closure, contains);
  94 
  95   // Treat discovered as normal oop, if ref is not "active" (next non-NULL).
  96   T next_oop  = oopDesc::load_heap_oop((T*)java_lang_ref_Reference::next_addr(obj));
  97   if (!oopDesc::is_null(next_oop)) {
  98     do_discovered<nv, T>(obj, closure, contains);
  99   }
 100 
 101   // Treat next as normal oop.
 102   do_next<nv, T>(obj, closure, contains);
 103 }
 104 
 105 template <bool nv, typename T, class OopClosureType, class Contains>
 106 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) {
 107   do_referent<nv, T>(obj, closure, contains);
 108   do_discovered<nv, T>(obj, closure, contains);
 109   do_next<nv, T>(obj, closure, contains);
 110 
 111   trace_reference_gc("InstanceRefKlass::oop_oop_iterate_fields()",
 112                      obj,
 113                      (T*)java_lang_ref_Reference::referent_addr(obj),
 114                      (T*)java_lang_ref_Reference::next_addr(obj),
 115                      (T*)java_lang_ref_Reference::discovered_addr(obj));
 116 }
 117 
 118 template <bool nv, typename T, class OopClosureType, class Contains>
 119 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
 120   switch (closure->reference_iteration_mode()) {
 121     case ExtendedOopClosure::DO_DISCOVERY:
 122       oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
 123       break;
 124     case ExtendedOopClosure::DO_FIELDS:
 125       oop_oop_iterate_fields<nv, T>(obj, closure, contains);
 126       break;
 127     default:
 128       ShouldNotReachHere();
 129   }
 130 }


< prev index next >