From 1b2147a23f1bdc2ed4a91ddbb4ac70b26e5cfb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Gr=C3=B6nlund?= Date: Wed, 23 Jun 2021 11:49:25 +0000 Subject: [PATCH] 8269125: Klass enqueue element size calculation wrong when traceid value cross compress limit Reviewed-by: jbachorik, egahlin --- .../types/traceid/jfrTraceIdKlassQueue.cpp | 24 ++++++++++++------- .../jfr/utilities/jfrEpochQueue.inline.hpp | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdKlassQueue.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdKlassQueue.cpp index 9b198198617..7344e2aa6b4 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdKlassQueue.cpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdKlassQueue.cpp @@ -67,7 +67,7 @@ static const size_t ELEMENT_SIZE = sizeof(JfrEpochQueueKlassElement); static const size_t NARROW_ELEMENT_SIZE = sizeof(JfrEpochQueueNarrowKlassElement); static const size_t THRESHOLD_SHIFT = 30; -// If the upshifted traceid value is less than this threshold (1 073 741 824), +// If the traceid value is less than this threshold (1 073 741 824), // compress the element for more effective queue storage. static const traceid uncompressed_threshold = ((traceid)1) << THRESHOLD_SHIFT; @@ -121,30 +121,36 @@ static traceid read_element(const u1* pos, const Klass** klass, bool compressed) return compressed ? read_compressed_element(pos, klass) : read_uncompressed_element(pos, klass); } +template +static inline void store_traceid(T* element, traceid id, bool uncompressed) { +#ifdef VM_LITTLE_ENDIAN + id <<= METADATA_SHIFT; +#endif + element->id = uncompressed ? id | UNCOMPRESSED : id; +} + static void store_compressed_element(traceid id, const Klass* klass, u1* pos) { + assert(can_compress_element(id), "invariant"); JfrEpochQueueNarrowKlassElement* const element = new (pos) JfrEpochQueueNarrowKlassElement(); - element->id = id; + store_traceid(element, id, false); element->compressed_klass = encode(klass); } static void store_uncompressed_element(traceid id, const Klass* klass, u1* pos) { JfrEpochQueueKlassElement* const element = new (pos) JfrEpochQueueKlassElement(); - element->id = id | UNCOMPRESSED; + store_traceid(element, id, true); element->klass = klass; } static void store_element(const Klass* klass, u1* pos) { assert(pos != NULL, "invariant"); assert(klass != NULL, "invariant"); - traceid id = JfrTraceId::load_raw(klass); -#ifdef VM_LITTLE_ENDIAN - id <<= METADATA_SHIFT; -#endif + const traceid id = JfrTraceId::load_raw(klass); if (can_compress_element(id)) { store_compressed_element(id, klass, pos); - } else { - store_uncompressed_element(id, klass, pos); + return; } + store_uncompressed_element(id, klass, pos); } static void set_unloaded(const u1* pos) { diff --git a/src/hotspot/share/jfr/utilities/jfrEpochQueue.inline.hpp b/src/hotspot/share/jfr/utilities/jfrEpochQueue.inline.hpp index 454934a83cd..fffeeafb8a5 100644 --- a/src/hotspot/share/jfr/utilities/jfrEpochQueue.inline.hpp +++ b/src/hotspot/share/jfr/utilities/jfrEpochQueue.inline.hpp @@ -68,7 +68,7 @@ JfrEpochQueue::storage_for_element(JfrEpochQueue:: template