src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdBits.inline.hpp
branchJEP-349-branch
changeset 57360 5d043a159d5c
parent 53244 9807daeb47c4
child 57870 00860d9caf4d
equal deleted inserted replaced
57359:4cab5edc2950 57360:5d043a159d5c
    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