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 }
|