@@ -3011,6 +3011,7 @@ struct _BulkTypeEventLogger {
3011
3011
uint8_t * bulk_type_event_buffer ;
3012
3012
uint32_t bulk_type_value_count ;
3013
3013
uint32_t bulk_type_value_byte_count ;
3014
+ MonoMemPool * mem_pool ;
3014
3015
};
3015
3016
3016
3017
static
@@ -3019,13 +3020,15 @@ ep_rt_bulk_type_event_logger_alloc ()
3019
3020
{
3020
3021
BulkTypeEventLogger * type_logger = g_malloc0 (sizeof (BulkTypeEventLogger ));
3021
3022
type_logger -> bulk_type_event_buffer = g_malloc0 (sizeof (uint8_t ) * MAX_SIZE_OF_EVENT_BUFFER );
3023
+ type_logger -> mem_pool = mono_mempool_new ();
3022
3024
return type_logger ;
3023
3025
}
3024
3026
3025
3027
static
3026
3028
void
3027
3029
ep_rt_bulk_type_event_logger_free (BulkTypeEventLogger * type_logger )
3028
3030
{
3031
+ mono_mempool_destroy (type_logger -> mem_pool );
3029
3032
g_free (type_logger -> bulk_type_event_buffer );
3030
3033
g_free (type_logger );
3031
3034
}
@@ -3189,7 +3192,6 @@ get_typeid_for_class (MonoClass *c)
3189
3192
int
3190
3193
ep_rt_mono_log_single_type (
3191
3194
BulkTypeEventLogger * type_logger ,
3192
- MonoMemPool * mem_pool ,
3193
3195
MonoType * mono_type )
3194
3196
{
3195
3197
// If there's no room for another type, flush what we've got
@@ -3236,7 +3238,7 @@ ep_rt_mono_log_single_type (
3236
3238
}
3237
3239
3238
3240
// mono arrays are always arrays of by value types
3239
- val -> mono_type_parameters = mono_mempool_alloc0 (mem_pool , 1 * sizeof (MonoType * ));
3241
+ val -> mono_type_parameters = mono_mempool_alloc0 (type_logger -> mem_pool , 1 * sizeof (MonoType * ));
3240
3242
* val -> mono_type_parameters = m_class_get_byval_arg (mono_array_type -> eklass );
3241
3243
val -> type_parameters_count ++ ;
3242
3244
break ;
@@ -3245,7 +3247,7 @@ ep_rt_mono_log_single_type (
3245
3247
{
3246
3248
MonoGenericInst * class_inst = mono_type -> data .generic_class -> context .class_inst ;
3247
3249
val -> type_parameters_count = class_inst -> type_argc ;
3248
- val -> mono_type_parameters = mono_mempool_alloc0 (mem_pool , val -> type_parameters_count * sizeof (MonoType * ));
3250
+ val -> mono_type_parameters = mono_mempool_alloc0 (type_logger -> mem_pool , val -> type_parameters_count * sizeof (MonoType * ));
3249
3251
memcpy (val -> mono_type_parameters , class_inst -> type_argv , val -> type_parameters_count * sizeof (MonoType * ));
3250
3252
break ;
3251
3253
}
@@ -3256,7 +3258,7 @@ ep_rt_mono_log_single_type (
3256
3258
{
3257
3259
if (mono_underlying_type == mono_type )
3258
3260
break ;
3259
- val -> mono_type_parameters = mono_mempool_alloc0 (mem_pool , 1 * sizeof (MonoType * ));
3261
+ val -> mono_type_parameters = mono_mempool_alloc0 (type_logger -> mem_pool , 1 * sizeof (MonoType * ));
3260
3262
* val -> mono_type_parameters = mono_underlying_type ;
3261
3263
val -> type_parameters_count ++ ;
3262
3264
break ;
@@ -3285,7 +3287,7 @@ ep_rt_mono_log_single_type (
3285
3287
// call itself again.
3286
3288
g_assert (type_logger -> bulk_type_value_byte_count + val_byte_count > MAX_TYPE_VALUES_BYTES );
3287
3289
ep_rt_mono_fire_bulk_type_event (type_logger );
3288
- return ep_rt_mono_log_single_type (type_logger , mem_pool , mono_type );
3290
+ return ep_rt_mono_log_single_type (type_logger , mono_type );
3289
3291
}
3290
3292
3291
3293
// The type fits into the batch, so update our state
@@ -3308,12 +3310,11 @@ ep_rt_mono_log_single_type (
3308
3310
void
3309
3311
ep_rt_mono_log_type_and_parameters (
3310
3312
BulkTypeEventLogger * type_logger ,
3311
- MonoMemPool * mem_pool ,
3312
3313
MonoType * mono_type )
3313
3314
{
3314
3315
// Batch up this type. This grabs useful info about the type, including any
3315
3316
// type parameters it may have, and sticks it in bulk_type_values
3316
- int bulk_type_value_index = ep_rt_mono_log_single_type (type_logger , mem_pool , mono_type );
3317
+ int bulk_type_value_index = ep_rt_mono_log_single_type (type_logger , mono_type );
3317
3318
if (bulk_type_value_index == -1 ) {
3318
3319
// There was a failure trying to log the type, so don't bother with its type
3319
3320
// parameters
@@ -3330,11 +3331,11 @@ ep_rt_mono_log_type_and_parameters (
3330
3331
if (param_count == 0 )
3331
3332
return ;
3332
3333
3333
- MonoType * * mono_type_parameters = mono_mempool_alloc0 (mem_pool , param_count * sizeof (MonoType * ));
3334
+ MonoType * * mono_type_parameters = mono_mempool_alloc0 (type_logger -> mem_pool , param_count * sizeof (MonoType * ));
3334
3335
memcpy (mono_type_parameters , val -> mono_type_parameters , sizeof (MonoType * ) * param_count );
3335
3336
3336
3337
for (uint32_t i = 0 ; i < param_count ; i ++ )
3337
- ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , mem_pool , mono_type_parameters [i ]);
3338
+ ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , mono_type_parameters [i ]);
3338
3339
}
3339
3340
3340
3341
//---------------------------------------------------------------------------------------
@@ -3351,12 +3352,11 @@ ep_rt_mono_log_type_and_parameters (
3351
3352
void
3352
3353
ep_rt_mono_log_type_and_parameters_if_necessary (
3353
3354
BulkTypeEventLogger * type_logger ,
3354
- MonoMemPool * mem_pool ,
3355
3355
MonoType * mono_type )
3356
3356
{
3357
3357
// TODO Log the type if necessary
3358
3358
3359
- ep_rt_mono_log_type_and_parameters (type_logger , mem_pool , mono_type );
3359
+ ep_rt_mono_log_type_and_parameters (type_logger , mono_type );
3360
3360
}
3361
3361
3362
3362
// ETW has a limit for maximum event size. Do not log overly large method type argument sets
@@ -3393,7 +3393,6 @@ ep_rt_mono_send_method_details_event (MonoMethod *method)
3393
3393
return ;
3394
3394
3395
3395
BulkTypeEventLogger * type_logger = ep_rt_bulk_type_event_logger_alloc ();
3396
- MonoMemPool * mem_pool = mono_mempool_new ();
3397
3396
3398
3397
uint64_t method_type_id = 0 ;
3399
3398
g_assert (mono_metadata_token_index (method -> token ) != 0 );
@@ -3404,7 +3403,7 @@ ep_rt_mono_send_method_details_event (MonoMethod *method)
3404
3403
MonoType * method_mono_type = m_class_get_byval_arg (klass );
3405
3404
method_type_id = get_typeid_for_class (klass );
3406
3405
3407
- ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , mem_pool , method_mono_type );
3406
+ ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , method_mono_type );
3408
3407
3409
3408
loader_module_id = (uint64_t )mono_class_get_image (klass );
3410
3409
}
@@ -3413,11 +3412,11 @@ ep_rt_mono_send_method_details_event (MonoMethod *method)
3413
3412
if (method_inst )
3414
3413
method_inst_parameter_types_count = method_inst -> type_argc ;
3415
3414
3416
- uint64_t * method_inst_parameters_type_ids = mono_mempool_alloc0 (mem_pool , method_inst_parameter_types_count * sizeof (uint64_t ));
3415
+ uint64_t * method_inst_parameters_type_ids = mono_mempool_alloc0 (type_logger -> mem_pool , method_inst_parameter_types_count * sizeof (uint64_t ));
3417
3416
for (int i = 0 ; i < method_inst_parameter_types_count ; i ++ ) {
3418
3417
method_inst_parameters_type_ids [i ] = get_typeid_for_type (method_inst -> type_argv [i ]);
3419
3418
3420
- ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , mem_pool , method_inst -> type_argv [i ]);
3419
+ ep_rt_mono_log_type_and_parameters_if_necessary (type_logger , method_inst -> type_argv [i ]);
3421
3420
}
3422
3421
3423
3422
ep_rt_mono_fire_bulk_type_event (type_logger );
@@ -3432,7 +3431,6 @@ ep_rt_mono_send_method_details_event (MonoMethod *method)
3432
3431
NULL ,
3433
3432
NULL );
3434
3433
3435
- mono_mempool_destroy (mem_pool );
3436
3434
ep_rt_bulk_type_event_logger_free (type_logger );
3437
3435
}
3438
3436
0 commit comments