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 |