diff -r a9cc3698a55c -r f6502e486572 src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.cpp --- 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); -} -