< 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 >