src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdBits.inline.hpp
equal
deleted
inserted
replaced
38 static const int leakp_offset = low_offset - 1; |
38 static const int leakp_offset = low_offset - 1; |
39 #endif |
39 #endif |
40 |
40 |
41 inline void set_bits(jbyte bits, jbyte* const dest) { |
41 inline void set_bits(jbyte bits, jbyte* const dest) { |
42 assert(dest != NULL, "invariant"); |
42 assert(dest != NULL, "invariant"); |
43 const jbyte current = OrderAccess::load_acquire(dest); |
43 const jbyte current = *dest; |
44 if (bits != (current & bits)) { |
44 if (bits != (current & bits)) { |
45 *dest |= bits; |
45 *dest = current | bits; |
46 } |
|
47 } |
|
48 |
46 |
49 inline void set_mask(jbyte mask, jbyte* const dest) { |
47 OrderAccess::storestore(); |
50 assert(dest != NULL, "invariant"); |
|
51 const jbyte current = OrderAccess::load_acquire(dest); |
|
52 if (mask != (current & mask)) { |
|
53 *dest &= mask; |
|
54 } |
48 } |
55 } |
49 } |
56 |
50 |
57 inline void set_bits_cas(jbyte bits, jbyte* const dest) { |
51 inline void set_bits_cas(jbyte bits, jbyte* const dest) { |
58 assert(dest != NULL, "invariant"); |
52 assert(dest != NULL, "invariant"); |
80 return; |
74 return; |
81 } |
75 } |
82 } while (true); |
76 } while (true); |
83 } |
77 } |
84 |
78 |
|
79 inline void set_mask(jbyte mask, jbyte* const dest) { |
|
80 assert(dest != NULL, "invariant"); |
|
81 const jbyte current = *dest; |
|
82 if (mask != (current & mask)) { |
|
83 *dest = current & mask; |
|
84 OrderAccess::storestore(); |
|
85 } |
|
86 } |
|
87 inline void set_mask_cas(jbyte mask, jbyte* const dest) { |
|
88 assert(dest != NULL, "invariant"); |
|
89 do { |
|
90 const jbyte current = OrderAccess::load_acquire(dest); |
|
91 if (mask == (current & mask)) { |
|
92 return; |
|
93 } |
|
94 const jbyte new_value = current & mask; |
|
95 if (Atomic::cmpxchg(new_value, dest, current) == current) { |
|
96 return; |
|
97 } |
|
98 } while (true); |
|
99 } |
85 inline void set_traceid_bits(jbyte bits, traceid* dest) { |
100 inline void set_traceid_bits(jbyte bits, traceid* dest) { |
86 set_bits(bits, ((jbyte*)dest) + low_offset); |
101 set_bits(bits, ((jbyte*)dest) + low_offset); |
87 } |
102 } |
88 |
103 |
89 inline void set_traceid_bits_cas(jbyte bits, traceid* dest) { |
104 inline void set_traceid_bits_cas(jbyte bits, traceid* dest) { |
101 inline void set_leakp_traceid_bits_cas(jbyte bits, traceid* dest) { |
116 inline void set_leakp_traceid_bits_cas(jbyte bits, traceid* dest) { |
102 set_bits_cas(bits, ((jbyte*)dest) + leakp_offset); |
117 set_bits_cas(bits, ((jbyte*)dest) + leakp_offset); |
103 } |
118 } |
104 |
119 |
105 inline void set_leakp_traceid_mask(jbyte mask, traceid* dest) { |
120 inline void set_leakp_traceid_mask(jbyte mask, traceid* dest) { |
106 set_mask(mask, ((jbyte*)dest) + leakp_offset); |
121 set_mask_cas(mask, ((jbyte*)dest) + leakp_offset); |
107 } |
122 } |
108 |
123 |
109 #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDBITS_INLINE_HPP |
124 #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDBITS_INLINE_HPP |