src/hotspot/share/oops/markWord.inline.hpp
changeset 57812 9bb28ccc6106
parent 57811 947252a54b98
child 58679 9c3209ff7550
child 59053 ba6c248cae19
equal deleted inserted replaced
57811:947252a54b98 57812:9bb28ccc6106
    25 #ifndef SHARE_OOPS_MARKWORD_INLINE_HPP
    25 #ifndef SHARE_OOPS_MARKWORD_INLINE_HPP
    26 #define SHARE_OOPS_MARKWORD_INLINE_HPP
    26 #define SHARE_OOPS_MARKWORD_INLINE_HPP
    27 
    27 
    28 #include "oops/klass.hpp"
    28 #include "oops/klass.hpp"
    29 #include "oops/markWord.hpp"
    29 #include "oops/markWord.hpp"
    30 #include "oops/oop.inline.hpp"
       
    31 #include "runtime/globals.hpp"
    30 #include "runtime/globals.hpp"
    32 
    31 
    33 // Should this header be preserved during GC (when biased locking is enabled)?
    32 // Should this header be preserved during GC?
    34 inline bool markWord::must_be_preserved_with_bias(oop obj_containing_mark) const {
    33 template <typename KlassProxy>
    35   assert(UseBiasedLocking, "unexpected");
    34 inline bool markWord::must_be_preserved(KlassProxy klass) const {
    36   if (has_bias_pattern()) {
    35   if (UseBiasedLocking) {
    37     // Will reset bias at end of collection
    36     if (has_bias_pattern()) {
    38     // Mark words of biased and currently locked objects are preserved separately
    37       // Will reset bias at end of collection
    39     return false;
    38       // Mark words of biased and currently locked objects are preserved separately
    40   }
    39       return false;
    41   markWord prototype_header = prototype_for_object(obj_containing_mark);
    40     }
    42   if (prototype_header.has_bias_pattern()) {
    41     markWord prototype_header = prototype_for_klass(klass);
    43     // Individual instance which has its bias revoked; must return
    42     if (prototype_header.has_bias_pattern()) {
    44     // true for correctness
    43       // Individual instance which has its bias revoked; must return
    45     return true;
    44       // true for correctness
       
    45       return true;
       
    46     }
    46   }
    47   }
    47   return (!is_unlocked() || !has_no_hash());
    48   return (!is_unlocked() || !has_no_hash());
    48 }
    49 }
    49 
    50 
    50 // Should this header be preserved during GC?
    51 // Should this header be preserved in the case of a promotion failure during scavenge?
    51 inline bool markWord::must_be_preserved(oop obj_containing_mark) const {
    52 template <typename KlassProxy>
    52   if (!UseBiasedLocking)
    53 inline bool markWord::must_be_preserved_for_promotion_failure(KlassProxy klass) const {
    53     return (!is_unlocked() || !has_no_hash());
    54   if (UseBiasedLocking) {
    54   return must_be_preserved_with_bias(obj_containing_mark);
    55     // We don't explicitly save off the mark words of biased and
    55 }
    56     // currently-locked objects during scavenges, so if during a
    56 
    57     // promotion failure we encounter either a biased mark word or a
    57 // Should this header be preserved in the case of a promotion failure
    58     // klass which still has a biasable prototype header, we have to
    58 // during scavenge (when biased locking is enabled)?
    59     // preserve the mark word. This results in oversaving, but promotion
    59 inline bool markWord::must_be_preserved_with_bias_for_promotion_failure(oop obj_containing_mark) const {
    60     // failures are rare, and this avoids adding more complex logic to
    60   assert(UseBiasedLocking, "unexpected");
    61     // the scavengers to call new variants of
    61   // We don't explicitly save off the mark words of biased and
    62     // BiasedLocking::preserve_marks() / restore_marks() in the middle
    62   // currently-locked objects during scavenges, so if during a
    63     // of a scavenge when a promotion failure has first been detected.
    63   // promotion failure we encounter either a biased mark word or a
    64     if (has_bias_pattern() || prototype_for_klass(klass).has_bias_pattern()) {
    64   // klass which still has a biasable prototype header, we have to
    65       return true;
    65   // preserve the mark word. This results in oversaving, but promotion
    66     }
    66   // failures are rare, and this avoids adding more complex logic to
       
    67   // the scavengers to call new variants of
       
    68   // BiasedLocking::preserve_marks() / restore_marks() in the middle
       
    69   // of a scavenge when a promotion failure has first been detected.
       
    70   if (has_bias_pattern() ||
       
    71       prototype_for_object(obj_containing_mark).has_bias_pattern()) {
       
    72     return true;
       
    73   }
    67   }
    74   return (!is_unlocked() || !has_no_hash());
    68   return (!is_unlocked() || !has_no_hash());
    75 }
    69 }
    76 
    70 
    77 // Should this header be preserved in the case of a promotion failure
    71 // Same as must_be_preserved_for_promotion_failure().
    78 // during scavenge?
    72 inline bool markWord::must_be_preserved_for_cms_scavenge(Klass* klass_of_obj_containing_mark) const {
    79 inline bool markWord::must_be_preserved_for_promotion_failure(oop obj_containing_mark) const {
    73   return must_be_preserved_for_promotion_failure(klass_of_obj_containing_mark);
    80   if (!UseBiasedLocking)
       
    81     return (!is_unlocked() || !has_no_hash());
       
    82   return must_be_preserved_with_bias_for_promotion_failure(obj_containing_mark);
       
    83 }
    74 }
    84 
    75 
       
    76 inline markWord markWord::prototype_for_klass(const Klass* klass) {
       
    77   markWord prototype_header = klass->prototype_header();
       
    78   assert(prototype_header == prototype() || prototype_header.has_bias_pattern(), "corrupt prototype header");
    85 
    79 
    86 // Same as must_be_preserved_with_bias_for_promotion_failure() except that
    80   return prototype_header;
    87 // it takes a Klass* argument, instead of the object of which this is the mark word.
       
    88 inline bool markWord::must_be_preserved_with_bias_for_cms_scavenge(Klass* klass_of_obj_containing_mark) const {
       
    89   assert(UseBiasedLocking, "unexpected");
       
    90   // CMS scavenges preserve mark words in similar fashion to promotion failures; see above
       
    91   if (has_bias_pattern() ||
       
    92       klass_of_obj_containing_mark->prototype_header().has_bias_pattern()) {
       
    93     return true;
       
    94   }
       
    95   return (!is_unlocked() || !has_no_hash());
       
    96 }
       
    97 
       
    98 // Same as must_be_preserved_for_promotion_failure() except that
       
    99 // it takes a Klass* argument, instead of the object of which this is the mark word.
       
   100 inline bool markWord::must_be_preserved_for_cms_scavenge(Klass* klass_of_obj_containing_mark) const {
       
   101   if (!UseBiasedLocking)
       
   102     return (!is_unlocked() || !has_no_hash());
       
   103   return must_be_preserved_with_bias_for_cms_scavenge(klass_of_obj_containing_mark);
       
   104 }
       
   105 
       
   106 inline markWord markWord::prototype_for_object(oop obj) {
       
   107 #ifdef ASSERT
       
   108   markWord prototype_header = obj->klass()->prototype_header();
       
   109   assert(prototype_header == prototype() || prototype_header.has_bias_pattern(), "corrupt prototype header");
       
   110 #endif
       
   111   return obj->klass()->prototype_header();
       
   112 }
    81 }
   113 
    82 
   114 #endif // SHARE_OOPS_MARKWORD_INLINE_HPP
    83 #endif // SHARE_OOPS_MARKWORD_INLINE_HPP