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