src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp
changeset 58863 c16ac7a2eba4
parent 58132 caa25ab47aca
child 59247 56bf71d64d51
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
    23  */
    23  */
    24 
    24 
    25 #ifndef SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP
    25 #ifndef SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP
    26 #define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP
    26 #define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP
    27 
    27 
       
    28 #include "jfr/utilities/jfrTypes.hpp"
    28 #include "memory/allocation.hpp"
    29 #include "memory/allocation.hpp"
    29 #include "jfr/utilities/jfrTypes.hpp"
    30 #include "runtime/orderAccess.hpp"
    30 
    31 
    31 #define USED_BIT 1
    32 #define USED_BIT                             1
    32 #define METHOD_USED_BIT (USED_BIT << 2)
    33 #define METHOD_USED_BIT                      (USED_BIT << 2)
    33 #define EPOCH_1_SHIFT 0
    34 #define EPOCH_1_SHIFT                        0
    34 #define EPOCH_2_SHIFT 1
    35 #define EPOCH_2_SHIFT                        1
    35 #define USED_EPOCH_1_BIT (USED_BIT << EPOCH_1_SHIFT)
    36 #define USED_EPOCH_1_BIT                     (USED_BIT << EPOCH_1_SHIFT)
    36 #define USED_EPOCH_2_BIT (USED_BIT << EPOCH_2_SHIFT)
    37 #define USED_EPOCH_2_BIT                     (USED_BIT << EPOCH_2_SHIFT)
    37 #define METHOD_USED_EPOCH_1_BIT (METHOD_USED_BIT << EPOCH_1_SHIFT)
    38 #define METHOD_USED_EPOCH_1_BIT              (METHOD_USED_BIT << EPOCH_1_SHIFT)
    38 #define METHOD_USED_EPOCH_2_BIT (METHOD_USED_BIT << EPOCH_2_SHIFT)
    39 #define METHOD_USED_EPOCH_2_BIT              (METHOD_USED_BIT << EPOCH_2_SHIFT)
    39 #define METHOD_AND_CLASS_IN_USE_BITS (METHOD_USED_BIT | USED_BIT)
    40 #define METHOD_AND_CLASS_IN_USE_BITS         (METHOD_USED_BIT | USED_BIT)
    40 #define METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_1_SHIFT)
    41 #define METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_1_SHIFT)
    41 #define METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_2_SHIFT)
    42 #define METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_2_SHIFT)
    42 
    43 
    43 class JfrTraceIdEpoch : AllStatic {
    44 class JfrTraceIdEpoch : AllStatic {
    44   friend class JfrCheckpointManager;
    45   friend class JfrCheckpointManager;
    45  private:
    46  private:
    46   static bool _epoch_state;
    47   static bool _epoch_state;
       
    48   static bool volatile _tag_state;
       
    49 
    47   static void shift_epoch();
    50   static void shift_epoch();
    48 
    51 
    49  public:
    52  public:
    50   static bool epoch() {
    53   static bool epoch() {
    51     return _epoch_state;
    54     return _epoch_state;
    84   }
    87   }
    85 
    88 
    86   static traceid method_and_class_in_use_prev_epoch_bits() {
    89   static traceid method_and_class_in_use_prev_epoch_bits() {
    87     return _epoch_state ? METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS :  METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS;
    90     return _epoch_state ? METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS :  METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS;
    88   }
    91   }
       
    92 
       
    93   static bool has_changed_tag_state() {
       
    94     if (OrderAccess::load_acquire(&_tag_state)) {
       
    95       OrderAccess::release_store(&_tag_state, false);
       
    96       return true;
       
    97     }
       
    98     return false;
       
    99   }
       
   100 
       
   101   static void set_changed_tag_state() {
       
   102     if (!OrderAccess::load_acquire(&_tag_state)) {
       
   103       OrderAccess::release_store(&_tag_state, true);
       
   104     }
       
   105   }
    89 };
   106 };
    90 
   107 
    91 #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP
   108 #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP