Skip to content

Commit aafaffa

Browse files
davmasonlateralusX
andauthored
Delete dangling thread session states (#76691)
Co-Authored-By: Johan Lorensson <[email protected]> Co-authored-by: Johan Lorensson <[email protected]>
1 parent e9ff65a commit aafaffa

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

src/native/eventpipe/ep-buffer-manager.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,7 @@ buffer_manager_try_convert_buffer_to_read_only (
791791
EventPipeThread *thread = ep_buffer_get_writer_thread (new_read_buffer);
792792
EP_SPIN_LOCK_ENTER (ep_thread_get_rt_lock_ref (thread), section1);
793793
EventPipeThreadSessionState *thread_session_state = ep_thread_get_session_state (thread, buffer_manager->session);
794+
EP_ASSERT(thread_session_state != NULL);
794795
if (ep_thread_session_state_get_write_buffer (thread_session_state) == new_read_buffer) {
795796
ep_thread_session_state_set_write_buffer (thread_session_state, NULL);
796797
EP_ASSERT (ep_buffer_get_volatile_state (new_read_buffer) == EP_BUFFER_STATE_READ_ONLY);
@@ -1091,6 +1092,7 @@ ep_buffer_manager_suspend_write_event (
10911092
EventPipeThread *thread = ep_rt_thread_array_iterator_value (&thread_array_iterator);
10921093
EP_SPIN_LOCK_ENTER (ep_thread_get_rt_lock_ref (thread), section2)
10931094
EventPipeThreadSessionState *thread_session_state = ep_thread_get_session_state (thread, buffer_manager->session);
1095+
EP_ASSERT(thread_session_state != NULL);
10941096
ep_thread_session_state_set_write_buffer (thread_session_state, NULL);
10951097
EP_SPIN_LOCK_EXIT (ep_thread_get_rt_lock_ref (thread), section2)
10961098
ep_rt_thread_array_iterator_next (&thread_array_iterator);

src/native/eventpipe/ep-session.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ static
2626
void
2727
session_create_streaming_thread (EventPipeSession *session);
2828

29+
static
30+
void
31+
ep_session_remove_dangling_session_states (EventPipeSession *session);
32+
2933
/*
3034
* EventPipeSession.
3135
*/
@@ -216,6 +220,46 @@ ep_session_alloc (
216220
ep_exit_error_handler ();
217221
}
218222

223+
void
224+
ep_session_remove_dangling_session_states (EventPipeSession *session)
225+
{
226+
ep_return_void_if_nok (session != NULL);
227+
228+
EP_RT_DECLARE_LOCAL_THREAD_ARRAY (threads);
229+
ep_rt_thread_array_init (&threads);
230+
231+
ep_thread_get_threads (&threads);
232+
233+
ep_rt_thread_array_iterator_t threads_iterator = ep_rt_thread_array_iterator_begin (&threads);
234+
while (!ep_rt_thread_array_iterator_end (&threads, &threads_iterator)) {
235+
EventPipeThread *thread = ep_rt_thread_array_iterator_value (&threads_iterator);
236+
EP_ASSERT(thread != NULL);
237+
EP_SPIN_LOCK_ENTER (ep_thread_get_rt_lock_ref (thread), section1);
238+
EventPipeThreadSessionState *session_state = ep_thread_get_session_state(thread, session);
239+
if (session_state) {
240+
// If a buffer tries to write event(s) but never gets a buffer because the maximum total buffer size
241+
// has been exceeded, we can leak the EventPipeThreadSessionState* and crash later trying to access
242+
// the session from the thread session state. Whenever we terminate a session we check to make sure
243+
// we haven't leaked any thread session states.
244+
ep_thread_delete_session_state(thread, session);
245+
}
246+
EP_SPIN_LOCK_EXIT (ep_thread_get_rt_lock_ref (thread), section1);
247+
248+
// ep_thread_get_threads calls ep_thread_addref for every entry, need to release it here
249+
ep_thread_release (thread);
250+
251+
ep_rt_thread_array_iterator_next (&threads_iterator);
252+
}
253+
254+
ep_rt_thread_array_fini (&threads);
255+
256+
ep_on_exit:
257+
return;
258+
259+
ep_on_error:
260+
ep_exit_error_handler ();
261+
}
262+
219263
void
220264
ep_session_free (EventPipeSession *session)
221265
{
@@ -230,6 +274,8 @@ ep_session_free (EventPipeSession *session)
230274
ep_buffer_manager_free (session->buffer_manager);
231275
ep_file_free (session->file);
232276

277+
ep_session_remove_dangling_session_states (session);
278+
233279
ep_rt_object_free (session);
234280
}
235281

src/native/eventpipe/ep-thread.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ ep_thread_get_session_state (
247247

248248
ep_thread_requires_lock_held (thread);
249249

250-
EP_ASSERT (thread->session_state [ep_session_get_index (session)] != NULL);
251250
return thread->session_state [ep_session_get_index (session)];
252251
}
253252

0 commit comments

Comments
 (0)