82 } |
83 } |
83 |
84 |
84 void JfrThreadLocal::on_start(Thread* t) { |
85 void JfrThreadLocal::on_start(Thread* t) { |
85 assert(t != NULL, "invariant"); |
86 assert(t != NULL, "invariant"); |
86 assert(Thread::current() == t, "invariant"); |
87 assert(Thread::current() == t, "invariant"); |
|
88 JfrJavaSupport::on_thread_start(t); |
87 if (JfrRecorder::is_recording()) { |
89 if (JfrRecorder::is_recording()) { |
88 if (t->is_Java_thread()) { |
90 if (!t->jfr_thread_local()->is_excluded()) { |
89 send_java_thread_start_event((JavaThread*)t); |
91 JfrCheckpointManager::write_thread_checkpoint(t); |
|
92 if (t->is_Java_thread()) { |
|
93 send_java_thread_start_event((JavaThread*)t); |
|
94 } |
90 } |
95 } |
91 } |
96 } |
92 } |
97 } |
93 |
98 |
94 static void send_java_thread_end_events(traceid id, JavaThread* jt) { |
99 static void send_java_thread_end_events(traceid id, JavaThread* jt) { |
105 assert(tl != NULL, "invariant"); |
110 assert(tl != NULL, "invariant"); |
106 assert(t != NULL, "invariant"); |
111 assert(t != NULL, "invariant"); |
107 assert(Thread::current() == t, "invariant"); |
112 assert(Thread::current() == t, "invariant"); |
108 assert(!tl->is_dead(), "invariant"); |
113 assert(!tl->is_dead(), "invariant"); |
109 assert(tl->shelved_buffer() == NULL, "invariant"); |
114 assert(tl->shelved_buffer() == NULL, "invariant"); |
|
115 tl->_dead = true; |
|
116 if (tl->has_java_event_writer()) { |
|
117 assert(t->is_Java_thread(), "invariant"); |
|
118 const jobject event_writer = tl->java_event_writer(); |
|
119 tl->set_java_event_writer(NULL); |
|
120 JfrJavaSupport::destroy_global_jni_handle(event_writer); |
|
121 } |
110 if (tl->has_native_buffer()) { |
122 if (tl->has_native_buffer()) { |
111 JfrStorage::release_thread_local(tl->native_buffer(), t); |
123 JfrStorage::release_thread_local(tl->native_buffer(), t); |
112 } |
124 } |
113 if (tl->has_java_buffer()) { |
125 if (tl->has_java_buffer()) { |
114 JfrStorage::release_thread_local(tl->java_buffer(), t); |
126 JfrStorage::release_thread_local(tl->java_buffer(), t); |
115 } |
127 } |
116 if (tl->has_java_event_writer()) { |
|
117 assert(t->is_Java_thread(), "invariant"); |
|
118 JfrJavaSupport::destroy_global_jni_handle(tl->java_event_writer()); |
|
119 } |
|
120 if (tl->_stackframes != NULL) { |
128 if (tl->_stackframes != NULL) { |
121 FREE_C_HEAP_ARRAY(JfrStackFrame, tl->_stackframes); |
129 FREE_C_HEAP_ARRAY(JfrStackFrame, tl->_stackframes); |
122 } |
130 } |
123 tl->_dead = true; |
|
124 } |
131 } |
125 |
132 |
126 void JfrThreadLocal::on_exit(Thread* t) { |
133 void JfrThreadLocal::on_exit(Thread* t) { |
127 assert(t != NULL, "invariant"); |
134 assert(t != NULL, "invariant"); |
128 JfrThreadLocal * const tl = t->jfr_thread_local(); |
135 JfrThreadLocal * const tl = t->jfr_thread_local(); |
129 assert(!tl->is_dead(), "invariant"); |
136 assert(!tl->is_dead(), "invariant"); |
130 if (JfrRecorder::is_recording()) { |
137 if (JfrRecorder::is_recording()) { |
131 if (t->is_Java_thread()) { |
138 if (t->is_Java_thread() && !tl->is_excluded()) { |
132 send_java_thread_end_events(tl->thread_id(), (JavaThread*)t); |
139 send_java_thread_end_events(tl->thread_id(), (JavaThread*)t); |
133 } |
140 } |
134 } |
141 } |
135 release(tl, Thread::current()); // because it could be that Thread::current() != t |
142 release(tl, Thread::current()); // because it could be that Thread::current() != t |
136 } |
143 } |
137 |
144 |
|
145 static JfrBuffer* acquire_buffer(bool excluded) { |
|
146 JfrBuffer* const buffer = JfrStorage::acquire_thread_local(Thread::current()); |
|
147 if (buffer != NULL && excluded) { |
|
148 buffer->set_excluded(); |
|
149 } |
|
150 return buffer; |
|
151 } |
|
152 |
138 JfrBuffer* JfrThreadLocal::install_native_buffer() const { |
153 JfrBuffer* JfrThreadLocal::install_native_buffer() const { |
139 assert(!has_native_buffer(), "invariant"); |
154 assert(!has_native_buffer(), "invariant"); |
140 _native_buffer = JfrStorage::acquire_thread_local(Thread::current()); |
155 _native_buffer = acquire_buffer(_excluded); |
141 return _native_buffer; |
156 return _native_buffer; |
142 } |
157 } |
143 |
158 |
144 JfrBuffer* JfrThreadLocal::install_java_buffer() const { |
159 JfrBuffer* JfrThreadLocal::install_java_buffer() const { |
145 assert(!has_java_buffer(), "invariant"); |
160 assert(!has_java_buffer(), "invariant"); |
146 assert(!has_java_event_writer(), "invariant"); |
161 assert(!has_java_event_writer(), "invariant"); |
147 _java_buffer = JfrStorage::acquire_thread_local(Thread::current()); |
162 _java_buffer = acquire_buffer(_excluded); |
148 return _java_buffer; |
163 return _java_buffer; |
149 } |
164 } |
150 |
165 |
151 JfrStackFrame* JfrThreadLocal::install_stackframes() const { |
166 JfrStackFrame* JfrThreadLocal::install_stackframes() const { |
152 assert(_stackframes == NULL, "invariant"); |
167 assert(_stackframes == NULL, "invariant"); |