< prev index next >

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

Print this page

        

*** 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); } --- 38,86 ---- 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 = OrderAccess::load_acquire(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 >