@@ -154,6 +154,110 @@ session_disable_streaming_thread (EventPipeSession *session)
154154 ep_rt_wait_event_free (rt_thread_shutdown_event );
155155}
156156
157+ static
158+ uint32_t
159+ event_reg (uint32_t fd , const char * command , uint32_t * write , uint32_t * enabled )
160+ {
161+ #ifdef HAVE_LINUX_USER_EVENTS_H
162+ struct user_reg reg = {0 };
163+
164+ reg .size = sizeof (reg ); // uint32_t
165+ reg .enable_bit = 31 ; // uint8_t
166+ reg .enable_size = sizeof (* enabled ); // uint8_t
167+ // reg.flags //uint16_t
168+ reg .enable_addr = (uint64_t )enabled ; // uint64_t
169+ reg .name_args = (uint64_t )command ; // uint64_t
170+
171+ if (ioctl (fd , DIAG_IOCSREG , & reg ) == -1 )
172+ return -1 ;
173+
174+ * write = reg .write_index ; // uint32_t
175+
176+ return 0 ;
177+ #else // HAVE_LINUX_USER_EVENTS_H
178+ // Not Supported
179+ return -1 ;
180+ #endif // HAVE_LINUX_USER_EVENTS_H
181+ }
182+
183+ // Could bump this to when we are deserializing the payload
184+ // And then the ProviderConfigurations would instead own the actual
185+ // Tracepoint info like write_index, enable bit, mapping
186+ static
187+ void
188+ ep_session_user_events_tracepoints_init (
189+ EventPipeSession * session )
190+ {
191+ EP_ASSERT (session != NULL );
192+ EP_ASSERT (session -> session_type == EP_SESSION_TYPE_USEREVENTS );
193+
194+ EP_ASSERT (session -> user_events_data_fd != 0 );
195+
196+ EventPipeSessionProviderList * providers = ep_session_get_providers (session );
197+ EP_ASSERT (providers != NULL );
198+
199+ // Create a mapping of event_id to Tracepoint that we generate, for writing.
200+ for (dn_list_it_t it = dn_list_begin (ep_session_provider_list_get_providers (providers )); !dn_list_it_end (it ); it = dn_list_it_next (it )) {
201+ EventPipeSessionProvider * session_provider = * dn_list_it_data_t (it , EventPipeSessionProvider * );
202+ EP_ASSERT (session_provider != NULL );
203+
204+ // Should this be owned by each EventPipeSession ProviderConfiguration
205+ dn_umap_custom_alloc_params_t params = {0 , };
206+ params .hash_func = dn_int_hash ;
207+ params .equal_func = dn_int_equal ;
208+ dn_umap_t * provider_event_id_to_tracepoint_map = dn_umap_custom_alloc (& params );
209+
210+ // Should we bother to register tracepoints whos events don't pass the event_filter?
211+ ProviderTracepointConfiguration * tracepoint_config = ep_session_provider_get_tracepoint_config (session_provider );
212+
213+ dn_vector_t * tracepoints = tracepoint_config -> tracepoints ;
214+ if (tracepoints != NULL ) {
215+ for (int32_t i = 0 ; i < tracepoints -> size ; ++ i ) {
216+ // Get the tracepoint set
217+ ProviderTracepointSet * tracepoint_set = * dn_vector_index_t (tracepoints , ProviderTracepointSet * , i );
218+ EP_ASSERT (tracepoint_set != NULL );
219+
220+ // Get the tracepoint name for this set
221+ const ep_char8_t * tracepoint_name = tracepoint_set -> tracepoint_name ;
222+ EP_ASSERT (tracepoint_name != NULL );
223+
224+ EventPipeTracepoint * tracepoint = ep_rt_object_alloc (EventPipeTracepoint );
225+ EP_ASSERT (tracepoint != NULL );
226+ if (event_reg (session -> user_events_data_fd , tracepoint_name , & tracepoint -> write_index , & tracepoint -> enabled ) == -1 ) {
227+ ep_raise_error ();
228+ }
229+
230+ dn_vector_t * event_ids = tracepoint_set -> event_ids ;
231+ if (event_ids != NULL ) {
232+ for (int32_t j = 0 ; j < event_ids -> size ; ++ j ) {
233+ uint32_t * event_id = dn_vector_index_t (event_ids , uint32_t , j );
234+ dn_umap_result_t result = dn_umap_insert (provider_event_id_to_tracepoint_map , event_id , tracepoint );
235+ EP_ASSERT (result .result );
236+ }
237+ }
238+ }
239+ }
240+ session_provider -> event_id_to_tracepoint_map = provider_event_id_to_tracepoint_map ;
241+
242+ const ep_char8_t * default_tracepoint_name = tracepoint_config -> default_tracepoint_name ;
243+ if (default_tracepoint_name != NULL ) {
244+ EventPipeTracepoint * default_tracepoint = ep_rt_object_alloc (EventPipeTracepoint );
245+ EP_ASSERT (default_tracepoint != NULL );
246+ if (event_reg (session -> user_events_data_fd , default_tracepoint_name , & default_tracepoint -> write_index , & default_tracepoint -> enabled ) == -1 ) {
247+ ep_raise_error ();
248+ }
249+
250+ session_provider -> default_tracepoint = default_tracepoint ;
251+ }
252+ }
253+
254+ ep_on_exit :
255+ return ;
256+
257+ ep_on_error :
258+ ep_exit_error_handler ();
259+ }
260+
157261EventPipeSession *
158262ep_session_alloc (
159263 uint32_t index ,
@@ -236,7 +340,7 @@ ep_session_alloc (
236340 // Transfer ownership of the user_events_data file descriptor to the EventPipe Session.
237341 instance -> user_events_data_fd = user_events_data_fd ;
238342 // With the user_events_data file, register tracepoints for each provider's tracepoint configurations
239- // ep_session_user_events_tracepoints_init (instance);
343+ ep_session_user_events_tracepoints_init (instance );
240344 break ;
241345
242346 default :
0 commit comments