@@ -26,6 +26,10 @@ static
2626void
2727session_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+
219263void
220264ep_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
0 commit comments