--- a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.cpp Tue Aug 27 12:36:05 2019 +0200
+++ b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.cpp Wed Aug 28 12:03:58 2019 +0200
@@ -27,6 +27,7 @@
#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp"
#include "jfr/recorder/repository/jfrChunkWriter.hpp"
#include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
+#include "jfr/support/jfrThreadLocal.hpp"
#include "runtime/mutexLocker.hpp"
static JfrStackTraceRepository* _instance = NULL;
@@ -158,7 +159,7 @@
}
assert(frames != NULL, "invariant");
assert(tl->stackframes() == frames, "invariant");
- return instance().record_for((JavaThread*)thread, skip,frames, tl->stackdepth());
+ return instance().record_for((JavaThread*)thread, skip, frames, tl->stackdepth());
}
traceid JfrStackTraceRepository::record_for(JavaThread* thread, int skip, JfrStackFrame *frames, u4 max_frames) {
@@ -166,13 +167,6 @@
return stacktrace.record_safe(thread, skip) ? add(stacktrace) : 0;
}
-traceid JfrStackTraceRepository::add(const JfrStackTrace* stacktrace, JavaThread* thread) {
- assert(stacktrace != NULL, "invariant");
- assert(thread != NULL, "invariant");
- assert(stacktrace->hash() != 0, "invariant");
- return add(*stacktrace);
-}
-
traceid JfrStackTraceRepository::add(const JfrStackTrace& stacktrace) {
traceid tid = instance().add_trace(stacktrace);
if (tid == 0) {
@@ -183,6 +177,20 @@
return tid;
}
+traceid JfrStackTraceRepository::record_and_cache(JavaThread* thread, int skip /* 0 */) {
+ JfrThreadLocal* const tl = thread->jfr_thread_local();
+ assert(tl != NULL, "invariant");
+ if (tl->has_cached_stack_trace()) {
+ return tl->cached_stack_trace_id();
+ }
+ JfrStackTrace stacktrace(tl->stackframes(), tl->stackdepth());
+ stacktrace.record_safe(thread, skip);
+ assert(stacktrace.hash() != 0, "invariant");
+ const traceid id = instance().add(stacktrace);
+ tl->set_cached_stack_trace_id(id, stacktrace.hash());
+ return id;
+}
+
traceid JfrStackTraceRepository::add_trace(const JfrStackTrace& stacktrace) {
MutexLocker lock(JfrStacktrace_lock, Mutex::_no_safepoint_check_flag);
const size_t index = stacktrace._hash % TABLE_SIZE;
@@ -217,17 +225,3 @@
assert(trace->id() == id, "invariant");
return trace;
}
-
-bool JfrStackTraceRepository::fill_stacktrace_for(JavaThread* thread, JfrStackTrace* stacktrace, int skip) {
- assert(thread == Thread::current(), "invariant");
- assert(stacktrace != NULL, "invariant");
- JfrThreadLocal* const tl = thread->jfr_thread_local();
- assert(tl != NULL, "invariant");
- const unsigned int cached_stacktrace_hash = tl->cached_stack_trace_hash();
- if (cached_stacktrace_hash != 0) {
- stacktrace->set_hash(cached_stacktrace_hash);
- return true;
- }
- return stacktrace->record_safe(thread, skip);
-}
-