diff -r 2c3cc4b01880 -r c16ac7a2eba4 src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp Wed Oct 30 16:14:56 2019 +0100 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp Wed Oct 30 19:43:52 2019 +0100 @@ -25,18 +25,19 @@ #ifndef SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP #define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP +#include "jfr/utilities/jfrTypes.hpp" #include "memory/allocation.hpp" -#include "jfr/utilities/jfrTypes.hpp" +#include "runtime/orderAccess.hpp" -#define USED_BIT 1 -#define METHOD_USED_BIT (USED_BIT << 2) -#define EPOCH_1_SHIFT 0 -#define EPOCH_2_SHIFT 1 -#define USED_EPOCH_1_BIT (USED_BIT << EPOCH_1_SHIFT) -#define USED_EPOCH_2_BIT (USED_BIT << EPOCH_2_SHIFT) -#define METHOD_USED_EPOCH_1_BIT (METHOD_USED_BIT << EPOCH_1_SHIFT) -#define METHOD_USED_EPOCH_2_BIT (METHOD_USED_BIT << EPOCH_2_SHIFT) -#define METHOD_AND_CLASS_IN_USE_BITS (METHOD_USED_BIT | USED_BIT) +#define USED_BIT 1 +#define METHOD_USED_BIT (USED_BIT << 2) +#define EPOCH_1_SHIFT 0 +#define EPOCH_2_SHIFT 1 +#define USED_EPOCH_1_BIT (USED_BIT << EPOCH_1_SHIFT) +#define USED_EPOCH_2_BIT (USED_BIT << EPOCH_2_SHIFT) +#define METHOD_USED_EPOCH_1_BIT (METHOD_USED_BIT << EPOCH_1_SHIFT) +#define METHOD_USED_EPOCH_2_BIT (METHOD_USED_BIT << EPOCH_2_SHIFT) +#define METHOD_AND_CLASS_IN_USE_BITS (METHOD_USED_BIT | USED_BIT) #define METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_1_SHIFT) #define METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_2_SHIFT) @@ -44,6 +45,8 @@ friend class JfrCheckpointManager; private: static bool _epoch_state; + static bool volatile _tag_state; + static void shift_epoch(); public: @@ -86,6 +89,20 @@ static traceid method_and_class_in_use_prev_epoch_bits() { return _epoch_state ? METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS : METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS; } + + static bool has_changed_tag_state() { + if (OrderAccess::load_acquire(&_tag_state)) { + OrderAccess::release_store(&_tag_state, false); + return true; + } + return false; + } + + static void set_changed_tag_state() { + if (!OrderAccess::load_acquire(&_tag_state)) { + OrderAccess::release_store(&_tag_state, true); + } + } }; #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP