< prev index next >

src/share/vm/jfr/recorder/checkpoint/types/traceid/jfrTraceIdBits.inline.hpp

Print this page
rev 9056 : 8227605: Kitchensink fails "assert((((klass)->trace_id() & (JfrTraceIdEpoch::leakp_in_use_this_epoch_bit())) != 0)) failed: invariant"
Reviewed-by: dholmes, dcubed, egahlin

*** 25,35 **** #ifndef SHARE_VM_JFR_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDBITS_INLINE_HPP #define SHARE_VM_JFR_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDBITS_INLINE_HPP #include "jfr/utilities/jfrTypes.hpp" #include "runtime/atomic.inline.hpp" - #include "runtime/orderAccess.inline.hpp" #include "utilities/macros.hpp" #ifdef VM_LITTLE_ENDIAN static const int low_offset = 0; static const int leakp_offset = low_offset + 1; --- 25,34 ----
*** 38,87 **** static const int leakp_offset = low_offset - 1; #endif inline void set_bits(jbyte bits, jbyte* const dest) { assert(dest != NULL, "invariant"); ! const jbyte current = OrderAccess::load_acquire(dest); ! if (bits != (current & bits)) { *dest |= bits; } } ! inline void set_mask(jbyte mask, jbyte* const dest) { ! assert(dest != NULL, "invariant"); ! const jbyte current = OrderAccess::load_acquire(dest); ! if (mask != (current & mask)) { ! *dest &= mask; ! } } ! inline void set_bits_cas(jbyte bits, jbyte* const dest) { assert(dest != NULL, "invariant"); do { ! const jbyte current = OrderAccess::load_acquire(dest); ! if (bits == (current & bits)) { ! return; ! } ! const jbyte new_value = current | bits; if (Atomic::cmpxchg(new_value, dest, current) == current) { return; } } while (true); } inline void clear_bits_cas(jbyte bits, jbyte* const dest) { ! assert(dest != NULL, "invariant"); ! do { ! const jbyte current = OrderAccess::load_acquire(dest); ! if (bits != (current & bits)) { ! return; ! } ! const jbyte new_value = current ^ bits; ! if (Atomic::cmpxchg(new_value, dest, current) == current) { ! return; ! } ! } while (true); } inline void set_traceid_bits(jbyte bits, traceid* dest) { set_bits(bits, ((jbyte*)dest) + low_offset); } --- 37,85 ---- static const int leakp_offset = low_offset - 1; #endif inline void set_bits(jbyte bits, jbyte* const dest) { assert(dest != NULL, "invariant"); ! if (bits != (*dest & bits)) { *dest |= bits; } } ! inline jbyte traceid_and(jbyte current, jbyte bits) { ! return current & bits; } ! inline jbyte traceid_or(jbyte current, jbyte bits) { ! return current | bits; ! } ! ! inline jbyte traceid_xor(jbyte current, jbyte bits) { ! return current ^ bits; ! } ! ! template <jbyte op(jbyte, jbyte)> ! inline void set_bits_cas_form(jbyte bits, jbyte* const dest) { assert(dest != NULL, "invariant"); do { ! const jbyte current = *dest; ! const jbyte new_value = op(current, bits); if (Atomic::cmpxchg(new_value, dest, current) == current) { return; } } while (true); } + inline void set_bits_cas(jbyte bits, jbyte* const dest) { + set_bits_cas_form<traceid_or>(bits, dest); + } + inline void clear_bits_cas(jbyte bits, jbyte* const dest) { ! set_bits_cas_form<traceid_xor>(bits, dest); ! } ! ! inline void set_mask(jbyte mask, jbyte* const dest) { ! set_bits_cas_form<traceid_and>(mask, dest); } inline void set_traceid_bits(jbyte bits, traceid* dest) { set_bits(bits, ((jbyte*)dest) + low_offset); }
< prev index next >