diff -r 7aa1b3d6ff8f -r 68134337dbf8 src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp Sun Aug 25 13:27:54 2019 +0200 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp Sun Aug 25 15:13:16 2019 +0200 @@ -26,7 +26,7 @@ #define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_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) @@ -44,6 +44,8 @@ friend class JfrCheckpointManager; private: static bool _epoch_state; + static bool volatile _klass_tagged_in_epoch; + static void shift_epoch(); public: @@ -86,6 +88,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 is_klass_tagged_in_epoch() { + if (OrderAccess::load_acquire(&_klass_tagged_in_epoch)) { + OrderAccess::release_store(&_klass_tagged_in_epoch, false); + return true; + } + return false; + } + + static void set_klass_tagged_in_epoch() { + if (!OrderAccess::load_acquire(&_klass_tagged_in_epoch)) { + OrderAccess::release_store(&_klass_tagged_in_epoch, true); + } + } }; #endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_TRACEID_JFRTRACEIDEPOCH_HPP