hotspot/src/share/vm/oops/instanceRefKlass.inline.hpp
changeset 46445 825b002e05ae
parent 46415 7d5a286cdf89
child 46446 ababb65abf24
equal deleted inserted replaced
46444:677be3444372 46445:825b002e05ae
    77 
    77 
    78 template <bool nv, typename T, class OopClosureType, class Contains>
    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) {
    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));
    80   log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj));
    81 
    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.
    82   // Try to discover reference and return if it succeeds.
    88   if (try_discover<T>(obj, type, closure)) {
    83   if (try_discover<T>(obj, type, closure)) {
    89     return;
    84     return;
    90   }
    85   }
    91 
    86 
   114                      (T*)java_lang_ref_Reference::next_addr(obj),
   109                      (T*)java_lang_ref_Reference::next_addr(obj),
   115                      (T*)java_lang_ref_Reference::discovered_addr(obj));
   110                      (T*)java_lang_ref_Reference::discovered_addr(obj));
   116 }
   111 }
   117 
   112 
   118 template <bool nv, typename T, class OopClosureType, class Contains>
   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>
   119 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
   122 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
   120   switch (closure->reference_iteration_mode()) {
   123   switch (closure->reference_iteration_mode()) {
   121     case ExtendedOopClosure::DO_DISCOVERY:
   124     case ExtendedOopClosure::DO_DISCOVERY:
   122       oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
   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);
   123       break;
   129       break;
   124     case ExtendedOopClosure::DO_FIELDS:
   130     case ExtendedOopClosure::DO_FIELDS:
   125       oop_oop_iterate_fields<nv, T>(obj, closure, contains);
   131       oop_oop_iterate_fields<nv, T>(obj, closure, contains);
   126       break;
   132       break;
   127     default:
   133     default: