src/hotspot/share/gc/shared/accessBarrierSupport.cpp
changeset 52383 71564a544d4c
parent 47998 fb0275c320a0
equal deleted inserted replaced
52382:2e280ecec246 52383:71564a544d4c
    26 #include "classfile/javaClasses.inline.hpp"
    26 #include "classfile/javaClasses.inline.hpp"
    27 #include "gc/shared/accessBarrierSupport.inline.hpp"
    27 #include "gc/shared/accessBarrierSupport.inline.hpp"
    28 #include "oops/access.hpp"
    28 #include "oops/access.hpp"
    29 
    29 
    30 DecoratorSet AccessBarrierSupport::resolve_unknown_oop_ref_strength(DecoratorSet decorators, oop base, ptrdiff_t offset) {
    30 DecoratorSet AccessBarrierSupport::resolve_unknown_oop_ref_strength(DecoratorSet decorators, oop base, ptrdiff_t offset) {
       
    31   // Note that the referent in a FinalReference is technically not strong.
       
    32   // However, it always behaves like one in practice. The two cases are:
       
    33   //   1) A mutator calls Reference.get(). However, a mutator can only ever
       
    34   //      see inactive FinalReferences, whose referents really are strong.
       
    35   //   2) A GC heap walking operation. In this case the GC can see active
       
    36   //      FinalReferences, but the GC always wants to follow the referent
       
    37   //      as if it was strong.
    31   DecoratorSet ds = decorators & ~ON_UNKNOWN_OOP_REF;
    38   DecoratorSet ds = decorators & ~ON_UNKNOWN_OOP_REF;
    32   if (!java_lang_ref_Reference::is_referent_field(base, offset)) {
    39   if (!java_lang_ref_Reference::is_referent_field(base, offset) ||
       
    40       java_lang_ref_Reference::is_final(base)) {
    33     ds |= ON_STRONG_OOP_REF;
    41     ds |= ON_STRONG_OOP_REF;
    34   } else if (java_lang_ref_Reference::is_phantom(base)) {
    42   } else if (java_lang_ref_Reference::is_phantom(base)) {
    35     ds |= ON_PHANTOM_OOP_REF;
    43     ds |= ON_PHANTOM_OOP_REF;
    36   } else {
    44   } else {
    37     ds |= ON_WEAK_OOP_REF;
    45     ds |= ON_WEAK_OOP_REF;