< 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
rev 12854 : 8138888: Remove ExtendedOopClosure::apply_to_weak_ref_discovered_field
Reviewed-by:


  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 
  78 template <bool nv, typename T, class OopClosureType, class Contains>
  79 void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
  80   log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj));
  81 
  82   // Special case for some closures.
  83   if (closure->apply_to_weak_ref_discovered_field()) {
  84     do_discovered<nv, T>(obj, closure, contains);
  85   }
  86 
  87   // Try to discover reference and return if it succeeds.
  88   if (try_discover<T>(obj, type, closure)) {
  89     return;
  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 }
 131 
 132 class AlwaysContains {
 133  public:
 134   template <typename T> bool operator()(T* p) const { return true; }
 135 };
 136 
 137 template <bool nv, class OopClosureType>
 138 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure) {
 139   AlwaysContains always_contains;
 140   if (UseCompressedOops) {
 141     oop_oop_iterate_ref_processing_specialized<nv, narrowOop>(obj, closure, always_contains);
 142   } else {




  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 
  78 template <bool nv, typename T, class OopClosureType, class Contains>
  79 void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
  80   log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj));
  81 





  82   // Try to discover reference and return if it succeeds.
  83   if (try_discover<T>(obj, type, closure)) {
  84     return;
  85   }
  86 
  87   // Treat referent as normal oop.
  88   do_referent<nv, T>(obj, closure, contains);
  89 
  90   // Treat discovered as normal oop, if ref is not "active" (next non-NULL).
  91   T next_oop  = oopDesc::load_heap_oop((T*)java_lang_ref_Reference::next_addr(obj));
  92   if (!oopDesc::is_null(next_oop)) {
  93     do_discovered<nv, T>(obj, closure, contains);
  94   }
  95 
  96   // Treat next as normal oop.
  97   do_next<nv, T>(obj, closure, contains);
  98 }
  99 
 100 template <bool nv, typename T, class OopClosureType, class Contains>
 101 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) {
 102   do_referent<nv, T>(obj, closure, contains);
 103   do_discovered<nv, T>(obj, closure, contains);
 104   do_next<nv, T>(obj, closure, contains);
 105 
 106   trace_reference_gc("InstanceRefKlass::oop_oop_iterate_fields()",
 107                      obj,
 108                      (T*)java_lang_ref_Reference::referent_addr(obj),
 109                      (T*)java_lang_ref_Reference::next_addr(obj),
 110                      (T*)java_lang_ref_Reference::discovered_addr(obj));
 111 }
 112 
 113 template <bool nv, typename T, class OopClosureType, class Contains>
 114 void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
 115   // Explicitly apply closure to the discovered field.
 116   do_discovered<nv, T>(obj, closure, contains);
 117   // Then do normal reference processing with discovery.
 118   oop_oop_iterate_discovery<nv, T>(obj, type, closure, contains);
 119 }
 120 
 121 template <bool nv, typename T, class OopClosureType, class Contains>
 122 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
 123   switch (closure->reference_iteration_mode()) {
 124     case ExtendedOopClosure::DO_DISCOVERY:
 125       oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
 126       break;
 127     case ExtendedOopClosure::DO_DISCOVERED_AND_DISCOVERY:
 128       oop_oop_iterate_discovered_and_discovery<nv, T>(obj, reference_type(), closure, contains);
 129       break;
 130     case ExtendedOopClosure::DO_FIELDS:
 131       oop_oop_iterate_fields<nv, T>(obj, closure, contains);
 132       break;
 133     default:
 134       ShouldNotReachHere();
 135   }
 136 }
 137 
 138 class AlwaysContains {
 139  public:
 140   template <typename T> bool operator()(T* p) const { return true; }
 141 };
 142 
 143 template <bool nv, class OopClosureType>
 144 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure) {
 145   AlwaysContains always_contains;
 146   if (UseCompressedOops) {
 147     oop_oop_iterate_ref_processing_specialized<nv, narrowOop>(obj, closure, always_contains);
 148   } else {


< prev index next >