--- a/src/hotspot/share/jfr/support/jfrThreadLocal.cpp Fri May 17 15:53:21 2019 +0200
+++ b/src/hotspot/share/jfr/support/jfrThreadLocal.cpp Fri May 17 16:02:27 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -55,6 +55,7 @@
_stack_trace_hash(0),
_stackdepth(0),
_entering_suspend_flag(0),
+ _excluded(false),
_dead(false) {}
u8 JfrThreadLocal::add_data_lost(u8 value) {
@@ -84,9 +85,13 @@
void JfrThreadLocal::on_start(Thread* t) {
assert(t != NULL, "invariant");
assert(Thread::current() == t, "invariant");
+ JfrJavaSupport::on_thread_start(t);
if (JfrRecorder::is_recording()) {
- if (t->is_Java_thread()) {
- send_java_thread_start_event((JavaThread*)t);
+ if (!t->jfr_thread_local()->is_excluded()) {
+ JfrCheckpointManager::write_thread_checkpoint(t);
+ if (t->is_Java_thread()) {
+ send_java_thread_start_event((JavaThread*)t);
+ }
}
}
}
@@ -107,20 +112,22 @@
assert(Thread::current() == t, "invariant");
assert(!tl->is_dead(), "invariant");
assert(tl->shelved_buffer() == NULL, "invariant");
+ tl->_dead = true;
+ if (tl->has_java_event_writer()) {
+ assert(t->is_Java_thread(), "invariant");
+ const jobject event_writer = tl->java_event_writer();
+ tl->set_java_event_writer(NULL);
+ JfrJavaSupport::destroy_global_jni_handle(event_writer);
+ }
if (tl->has_native_buffer()) {
JfrStorage::release_thread_local(tl->native_buffer(), t);
}
if (tl->has_java_buffer()) {
JfrStorage::release_thread_local(tl->java_buffer(), t);
}
- if (tl->has_java_event_writer()) {
- assert(t->is_Java_thread(), "invariant");
- JfrJavaSupport::destroy_global_jni_handle(tl->java_event_writer());
- }
if (tl->_stackframes != NULL) {
FREE_C_HEAP_ARRAY(JfrStackFrame, tl->_stackframes);
}
- tl->_dead = true;
}
void JfrThreadLocal::on_exit(Thread* t) {
@@ -128,23 +135,31 @@
JfrThreadLocal * const tl = t->jfr_thread_local();
assert(!tl->is_dead(), "invariant");
if (JfrRecorder::is_recording()) {
- if (t->is_Java_thread()) {
+ if (t->is_Java_thread() && !tl->is_excluded()) {
send_java_thread_end_events(tl->thread_id(), (JavaThread*)t);
}
}
release(tl, Thread::current()); // because it could be that Thread::current() != t
}
+static JfrBuffer* acquire_buffer(bool excluded) {
+ JfrBuffer* const buffer = JfrStorage::acquire_thread_local(Thread::current());
+ if (buffer != NULL && excluded) {
+ buffer->set_excluded();
+ }
+ return buffer;
+}
+
JfrBuffer* JfrThreadLocal::install_native_buffer() const {
assert(!has_native_buffer(), "invariant");
- _native_buffer = JfrStorage::acquire_thread_local(Thread::current());
+ _native_buffer = acquire_buffer(_excluded);
return _native_buffer;
}
JfrBuffer* JfrThreadLocal::install_java_buffer() const {
assert(!has_java_buffer(), "invariant");
assert(!has_java_event_writer(), "invariant");
- _java_buffer = JfrStorage::acquire_thread_local(Thread::current());
+ _java_buffer = acquire_buffer(_excluded);
return _java_buffer;
}
@@ -163,3 +178,13 @@
ByteSize JfrThreadLocal::java_event_writer_offset() {
return in_ByteSize(offset_of(JfrThreadLocal, _java_event_writer));
}
+
+void JfrThreadLocal::exclude(Thread* t) {
+ assert(t != NULL, "invariant");
+ t->jfr_thread_local()->_excluded = true;
+}
+
+void JfrThreadLocal::include(Thread* t) {
+ assert(t != NULL, "invariant");
+ t->jfr_thread_local()->_excluded = false;
+}