@@ -429,8 +429,8 @@ buffer_manager_init_sequence_point_thread_list (
429429 ep_thread_session_state_set_track_state (thread_session_state , EP_SEQUENCE_POINT_THREAD_ID_TRACKED );
430430 }
431431
432- dn_umap_ptr_uint32_insert ( ep_sequence_point_get_thread_sequence_numbers ( sequence_point ), thread_session_state , sequence_number );
433- ep_thread_addref ( ep_thread_holder_get_thread ( ep_thread_session_state_get_thread_holder_ref ( thread_session_state )) );
432+ ep_rt_thread_id_t os_thread_id = ep_thread_get_os_thread_id ( ep_thread_session_state_get_thread ( thread_session_state ) );
433+ dn_umap_threadid_uint32_insert ( ep_sequence_point_get_thread_sequence_numbers ( sequence_point ), os_thread_id , sequence_number );
434434 } DN_LIST_FOREACH_END ;
435435
436436 // This needs to come after querying the thread sequence numbers to ensure that any recorded
@@ -737,15 +737,8 @@ buffer_manager_advance_to_non_empty_buffer (
737737 // get the next buffer
738738 current_buffer = buffer_list -> head_buffer ;
739739
740- if (!current_buffer && (ep_rt_volatile_load_uint32_t_without_barrier (ep_thread_get_unregistered_ref (ep_thread_session_state_get_thread (thread_session_state ))) > 0 )) {
741- if (buffer_manager -> sequence_point_alloc_budget != 0 ) {
742- // The next sequence point needs to update the sequence number for this thread
743- // Delay the thread session state removal until the next sequence point is written.
744- ep_thread_session_state_set_delete_deferred (thread_session_state , true);
745- } else {
746- buffer_manager_remove_and_delete_thread_session_state (buffer_manager , thread_session_state );
747- }
748- }
740+ if (!current_buffer && (ep_rt_volatile_load_uint32_t_without_barrier (ep_thread_get_unregistered_ref (ep_thread_session_state_get_thread (thread_session_state ))) > 0 ))
741+ buffer_manager_remove_and_delete_thread_session_state (buffer_manager , thread_session_state );
749742
750743 if (!current_buffer || ep_buffer_get_creation_timestamp (current_buffer ) >= before_timestamp ) {
751744 // no more buffers in the list before this timestamp, we're done
@@ -1189,9 +1182,10 @@ ep_buffer_manager_write_all_buffers_to_file_v4 (
11891182 if (buffer_manager -> current_event == NULL )
11901183 break ;
11911184
1192- uint64_t capture_thread_id = ep_thread_get_os_thread_id (ep_buffer_get_writer_thread (buffer_manager -> current_buffer ));
1185+ uint64_t capture_thread_id = ep_rt_thread_id_t_to_uint64_t ( ep_thread_get_os_thread_id (ep_buffer_get_writer_thread (buffer_manager -> current_buffer ) ));
11931186
11941187 EventPipeThreadSessionState * current_thread_session_state = buffer_manager -> current_thread_session_state ;
1188+ ep_rt_thread_id_t os_thread_id = ep_thread_get_os_thread_id (ep_thread_session_state_get_thread (current_thread_session_state ));
11951189
11961190 // loop across events on this thread
11971191 bool events_written_for_thread = false;
@@ -1208,11 +1202,23 @@ ep_buffer_manager_write_all_buffers_to_file_v4 (
12081202 buffer_manager_move_next_event_same_thread (buffer_manager , current_timestamp_boundary );
12091203 }
12101204
1211- ep_thread_session_state_set_last_read_sequence_number (current_thread_session_state , sequence_number );
1205+ dn_list_it_t found_tss = dn_list_find (buffer_manager -> thread_session_state_list , current_thread_session_state );
1206+ if (!dn_list_it_end (found_tss )) {
1207+ // If the ThreadSessionState hasn't been removed through buffer_manager_advance_to_non_empty_buffer,
1208+ // we need to update the last_read_sequence_number for any future sequence points being initialized.
1209+ ep_thread_session_state_set_last_read_sequence_number (current_thread_session_state , sequence_number );
1210+ }
1211+
12121212 if (sequence_point != NULL ) {
1213- dn_umap_it_t found = dn_umap_ptr_uint32_find (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), current_thread_session_state );
1214- EP_ASSERT (!dn_umap_it_end (found ));
1215- dn_umap_ptr_uint32_insert_or_assign (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), current_thread_session_state , sequence_number );
1213+ dn_umap_it_t found_thread_id = dn_umap_threadid_uint32_find (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), os_thread_id );
1214+ EP_ASSERT (!dn_umap_it_end (found_thread_id ));
1215+ uint32_t thread_sequence_number = !dn_umap_it_end (found_thread_id ) ? dn_umap_it_value_uint32_t (found_thread_id ) : 0 ;
1216+ // Sequence numbers can overflow so we can't use a direct last_read > sequence_number comparison
1217+ // If a thread is able to drop more than 0x80000000 events in between sequence points then we will
1218+ // miscategorize it, but that seems unlikely.
1219+ uint32_t last_read_delta = sequence_number - thread_sequence_number ;
1220+ if (0 < last_read_delta && last_read_delta < 0x80000000 )
1221+ dn_umap_threadid_uint32_insert_or_assign (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), os_thread_id , sequence_number );
12161222 }
12171223
12181224 // Have we written events in any sequence point?
@@ -1228,42 +1234,11 @@ ep_buffer_manager_write_all_buffers_to_file_v4 (
12281234
12291235 // stopped at sequence point case
12301236
1231- // the sequence point captured a lower bound for sequence number on each thread, but iterating
1232- // through the events we may have observed that a higher numbered event was recorded. If so we
1233- // should adjust the sequence numbers upwards to ensure the data in the stream is consistent.
1234- EP_SPIN_LOCK_ENTER (& buffer_manager -> rt_lock , section2 )
1235- for (dn_list_it_t it = dn_list_begin (buffer_manager -> thread_session_state_list ); !dn_list_it_end (it ); ) {
1236- EventPipeThreadSessionState * session_state = * dn_list_it_data_t (it , EventPipeThreadSessionState * );
1237- dn_umap_it_t found = dn_umap_ptr_uint32_find (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), session_state );
1238- uint32_t thread_sequence_number = !dn_umap_it_end (found ) ? dn_umap_it_value_uint32_t (found ) : 0 ;
1239- uint32_t last_read_sequence_number = ep_thread_session_state_get_last_read_sequence_number (session_state );
1240- EP_ASSERT (thread_sequence_number == 0 || thread_sequence_number == last_read_sequence_number );
1241- // Sequence numbers can overflow so we can't use a direct last_read > sequence_number comparison
1242- // If a thread is able to drop more than 0x80000000 events in between sequence points then we will
1243- // miscategorize it, but that seems unlikely.
1244- uint32_t last_read_delta = last_read_sequence_number - thread_sequence_number ;
1245- if (0 < last_read_delta && last_read_delta < 0x80000000 ) {
1246- dn_umap_ptr_uint32_insert_or_assign (ep_sequence_point_get_thread_sequence_numbers (sequence_point ), session_state , last_read_sequence_number );
1247- if (dn_umap_it_end (found ))
1248- ep_thread_addref (ep_thread_holder_get_thread (ep_thread_session_state_get_thread_holder_ref (session_state )));
1249- }
1250-
1251- it = dn_list_it_next (it );
1252-
1253- if (ep_thread_session_state_get_delete_deferred (session_state ))
1254- dn_vector_ptr_push_back (& session_states_to_delete , session_state );
1255- }
1256- EP_SPIN_LOCK_EXIT (& buffer_manager -> rt_lock , section2 )
1257-
12581237 // emit the sequence point into the file
12591238 ep_file_write_sequence_point (file , sequence_point );
12601239
12611240 // we are done with the sequence point
12621241 EP_SPIN_LOCK_ENTER (& buffer_manager -> rt_lock , section3 )
1263- DN_VECTOR_PTR_FOREACH_BEGIN (EventPipeThreadSessionState * , thread_session_state , & session_states_to_delete ) {
1264- if (ep_thread_session_state_get_delete_deferred (thread_session_state ))
1265- buffer_manager_remove_and_delete_thread_session_state (buffer_manager , thread_session_state );
1266- } DN_VECTOR_PTR_FOREACH_END ;
12671242 buffer_manager_dequeue_sequence_point (buffer_manager );
12681243 sequence_point = NULL ;
12691244 EP_SPIN_LOCK_EXIT (& buffer_manager -> rt_lock , section3 )
@@ -1350,27 +1325,6 @@ ep_buffer_manager_ensure_consistency (EventPipeBufferManager *buffer_manager)
13501325}
13511326#endif
13521327
1353- static
1354- void
1355- buffer_manager_remove_thread_session_state_from_sequence_points (
1356- EventPipeBufferManager * buffer_manager ,
1357- EventPipeThreadSessionState * thread_session_state )
1358- {
1359- EP_ASSERT (buffer_manager != NULL );
1360- EP_ASSERT (thread_session_state != NULL );
1361-
1362- ep_buffer_manager_requires_lock_held (buffer_manager );
1363-
1364- DN_LIST_FOREACH_BEGIN (EventPipeSequencePoint * , current_sequence_point , buffer_manager -> sequence_points ) {
1365- dn_umap_it_t found = dn_umap_ptr_uint32_find (ep_sequence_point_get_thread_sequence_numbers (current_sequence_point ), thread_session_state );
1366- if (!dn_umap_it_end (found )) {
1367- dn_umap_erase (found );
1368- // buffer_manager_init_sequence_point_thread_list - every entry of this map was holding an extra ref to the thread
1369- ep_thread_release (ep_thread_session_state_get_thread (thread_session_state ));
1370- }
1371- } DN_LIST_FOREACH_END ;
1372- }
1373-
13741328static
13751329void
13761330buffer_manager_remove_and_delete_thread_session_state (
@@ -1384,7 +1338,6 @@ buffer_manager_remove_and_delete_thread_session_state (
13841338
13851339 dn_list_remove (buffer_manager -> thread_session_state_list , thread_session_state );
13861340 ep_thread_set_session_state (ep_thread_session_state_get_thread (thread_session_state ), ep_thread_session_state_get_session (thread_session_state ), NULL );
1387- buffer_manager_remove_thread_session_state_from_sequence_points (buffer_manager , thread_session_state );
13881341 ep_thread_session_state_free (thread_session_state );
13891342}
13901343
0 commit comments