124 } |
124 } |
125 if (tl->has_java_buffer()) { |
125 if (tl->has_java_buffer()) { |
126 JfrStorage::release_thread_local(tl->java_buffer(), t); |
126 JfrStorage::release_thread_local(tl->java_buffer(), t); |
127 } |
127 } |
128 FREE_C_HEAP_ARRAY(JfrStackFrame, tl->_stackframes); |
128 FREE_C_HEAP_ARRAY(JfrStackFrame, tl->_stackframes); |
129 } |
|
130 } |
129 } |
131 |
130 |
132 void JfrThreadLocal::on_exit(Thread* t) { |
131 void JfrThreadLocal::on_exit(Thread* t) { |
133 assert(t != NULL, "invariant"); |
132 assert(t != NULL, "invariant"); |
134 JfrThreadLocal * const tl = t->jfr_thread_local(); |
133 JfrThreadLocal * const tl = t->jfr_thread_local(); |
135 assert(!tl->is_dead(), "invariant"); |
134 assert(!tl->is_dead(), "invariant"); |
136 if (JfrRecorder::is_recording()) { |
135 if (JfrRecorder::is_recording()) { |
137 if (t->is_Java_thread() && !tl->is_excluded()) { |
136 if (t->is_Java_thread()) { |
138 JavaThread* const jt = (JavaThread*)t; |
137 JavaThread* const jt = (JavaThread*)t; |
139 ObjectSampleCheckpoint::on_thread_exit(jt); |
138 ObjectSampleCheckpoint::on_thread_exit(jt); |
140 send_java_thread_end_events(tl->thread_id(), jt); |
139 send_java_thread_end_events(tl->thread_id(), jt); |
141 } |
140 } |
142 } |
141 } |