@@ -248,7 +248,6 @@ mono_profiler_enable_coverage (void)
248
248
return FALSE;
249
249
250
250
mono_os_mutex_init (& mono_profiler_state .coverage_mutex );
251
- mono_profiler_state .coverage_hash = g_hash_table_new (NULL , NULL );
252
251
253
252
if (!mono_debug_enabled ())
254
253
mono_debug_init (MONO_DEBUG_FORMAT_MONO );
@@ -279,17 +278,89 @@ mono_profiler_set_coverage_filter_callback (MonoProfilerHandle handle, MonoProfi
279
278
}
280
279
281
280
static void
282
- coverage_lock (void )
281
+ coverage_domains_lock (void )
283
282
{
284
283
mono_os_mutex_lock (& mono_profiler_state .coverage_mutex );
285
284
}
286
285
287
286
static void
288
- coverage_unlock (void )
287
+ coverage_domains_unlock (void )
289
288
{
290
289
mono_os_mutex_unlock (& mono_profiler_state .coverage_mutex );
291
290
}
292
291
292
+ static MonoDomainCoverage *
293
+ get_coverage_for_domain (MonoDomain * domain )
294
+ {
295
+ coverage_domains_lock ();
296
+ MonoDomainCoverage * cov = mono_profiler_state .coverage_domains ;
297
+ while (cov )
298
+ {
299
+ if (cov -> domain == domain )
300
+ break ;
301
+ cov = cov -> next ;
302
+ }
303
+ coverage_domains_unlock ();
304
+ return cov ;
305
+ }
306
+
307
+ void
308
+ mono_profiler_coverage_domain_init (MonoDomain * domain )
309
+ {
310
+ if (!mono_profiler_state .code_coverage )
311
+ return ;
312
+
313
+ MonoDomainCoverage * cov = g_new0 (MonoDomainCoverage , 1 );
314
+ cov -> domain = domain ;
315
+ cov -> coverage_hash = g_hash_table_new (NULL , NULL );
316
+ mono_os_mutex_init (& cov -> mutex );
317
+
318
+ coverage_domains_lock ();
319
+ cov -> next = mono_profiler_state .coverage_domains ;
320
+ mono_profiler_state .coverage_domains = cov ;
321
+ coverage_domains_unlock ();
322
+ }
323
+
324
+ void
325
+ mono_profiler_coverage_domain_free (MonoDomain * domain )
326
+ {
327
+ if (!mono_profiler_state .code_coverage )
328
+ return ;
329
+
330
+ coverage_domains_lock ();
331
+
332
+ MonoDomainCoverage * cov = mono_profiler_state .coverage_domains ;
333
+ MonoDomainCoverage * * prev = & mono_profiler_state .coverage_domains ;
334
+ while (cov )
335
+ {
336
+ if (cov -> domain == domain )
337
+ break ;
338
+
339
+ prev = & cov -> next ;
340
+ cov = cov -> next ;
341
+ }
342
+
343
+ if (cov != NULL )
344
+ {
345
+ * prev = cov -> next ;
346
+
347
+ GHashTableIter iter ;
348
+ g_hash_table_iter_init (& iter , cov -> coverage_hash );
349
+
350
+ MonoProfilerCoverageInfo * info ;
351
+ while (g_hash_table_iter_next (& iter , NULL , (gpointer * ) & info ))
352
+ g_free (info );
353
+
354
+ g_hash_table_destroy (cov -> coverage_hash );
355
+
356
+ mono_os_mutex_destroy (& cov -> mutex );
357
+
358
+ g_free (cov );
359
+ }
360
+
361
+ coverage_domains_unlock ();
362
+ }
363
+
293
364
/**
294
365
* mono_profiler_get_coverage_data:
295
366
*
@@ -313,11 +384,13 @@ mono_profiler_get_coverage_data (MonoProfilerHandle handle, MonoMethod *method,
313
384
if ((method -> flags & METHOD_ATTRIBUTE_ABSTRACT ) || (method -> iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME ) || (method -> iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL ) || (method -> flags & METHOD_ATTRIBUTE_PINVOKE_IMPL ))
314
385
return FALSE;
315
386
316
- coverage_lock ( );
387
+ MonoDomainCoverage * domain = get_coverage_for_domain ( mono_domain_get () );
317
388
318
- MonoProfilerCoverageInfo * info = g_hash_table_lookup ( mono_profiler_state . coverage_hash , method );
389
+ mono_os_mutex_lock ( & domain -> mutex );
319
390
320
- coverage_unlock ();
391
+ MonoProfilerCoverageInfo * info = g_hash_table_lookup (domain -> coverage_hash , method );
392
+
393
+ mono_os_mutex_unlock (& domain -> mutex );
321
394
322
395
MonoError error ;
323
396
MonoMethodHeader * header = mono_method_get_header_checked (method , & error );
@@ -475,11 +548,13 @@ mono_profiler_get_all_coverage_data(MonoProfilerHandle handle, MonoProfilerCover
475
548
info .cb = cb ;
476
549
info .handle = handle ;
477
550
478
- coverage_lock ();
551
+ MonoDomainCoverage * domain = get_coverage_for_domain (mono_domain_get ());
552
+
553
+ mono_os_mutex_lock (& domain -> mutex );
479
554
480
- g_hash_table_foreach (mono_profiler_state . coverage_hash , invoke_coverage_callback_for_hashtable_entry , & info );
555
+ g_hash_table_foreach (domain -> coverage_hash , invoke_coverage_callback_for_hashtable_entry , & info );
481
556
482
- coverage_unlock ( );
557
+ mono_os_mutex_unlock ( & domain -> mutex );
483
558
484
559
return TRUE;
485
560
}
@@ -493,11 +568,13 @@ mono_profiler_reset_coverage(MonoMethod* method)
493
568
if ((method -> flags & METHOD_ATTRIBUTE_ABSTRACT ) || (method -> iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME ) || (method -> iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL ) || (method -> flags & METHOD_ATTRIBUTE_PINVOKE_IMPL ))
494
569
return FALSE;
495
570
496
- coverage_lock ( );
571
+ MonoDomainCoverage * domain = get_coverage_for_domain ( mono_domain_get () );
497
572
498
- MonoProfilerCoverageInfo * info = g_hash_table_lookup ( mono_profiler_state . coverage_hash , method );
573
+ mono_os_mutex_lock ( & domain -> mutex );
499
574
500
- coverage_unlock ();
575
+ MonoProfilerCoverageInfo * info = g_hash_table_lookup (domain -> coverage_hash , method );
576
+
577
+ mono_os_mutex_unlock (& domain -> mutex );
501
578
502
579
if (!info )
503
580
return TRUE;
@@ -521,17 +598,19 @@ void mono_profiler_reset_all_coverage()
521
598
if (!mono_profiler_state .code_coverage )
522
599
return ;
523
600
524
- coverage_lock ();
601
+ MonoDomainCoverage * domain = get_coverage_for_domain (mono_domain_get ());
602
+
603
+ mono_os_mutex_lock (& domain -> mutex );
525
604
526
- g_hash_table_foreach (mono_profiler_state . coverage_hash , reset_coverage_for_hashtable_entry , NULL );
605
+ g_hash_table_foreach (domain -> coverage_hash , reset_coverage_for_hashtable_entry , NULL );
527
606
528
- coverage_unlock ( );
607
+ mono_os_mutex_unlock ( & domain -> mutex );
529
608
}
530
609
531
610
#endif
532
611
533
612
MonoProfilerCoverageInfo *
534
- mono_profiler_coverage_alloc (MonoMethod * method , guint32 entries )
613
+ mono_profiler_coverage_alloc (MonoDomain * domain , MonoMethod * method , guint32 entries )
535
614
{
536
615
if (!mono_profiler_state .code_coverage )
537
616
return FALSE;
@@ -551,33 +630,21 @@ mono_profiler_coverage_alloc (MonoMethod *method, guint32 entries)
551
630
if (!cover )
552
631
return NULL ;
553
632
554
- coverage_lock ();
633
+ MonoDomainCoverage * covdomain = get_coverage_for_domain (domain );
634
+
635
+ mono_os_mutex_lock (& covdomain -> mutex );
555
636
556
637
MonoProfilerCoverageInfo * info = g_malloc0 (sizeof (MonoProfilerCoverageInfo ) + SIZEOF_VOID_P * 2 * entries );
557
638
558
639
info -> entries = entries ;
559
640
560
- g_hash_table_insert (mono_profiler_state . coverage_hash , method , info );
641
+ g_hash_table_insert (covdomain -> coverage_hash , method , info );
561
642
562
- coverage_unlock ( );
643
+ mono_os_mutex_unlock ( & covdomain -> mutex );
563
644
564
645
return info ;
565
646
}
566
647
567
- void mono_profiler_coverage_free (MonoMethod * method , MonoProfilerCoverageInfo * info )
568
- {
569
- if (!mono_profiler_state .code_coverage )
570
- return ;
571
-
572
- coverage_lock ();
573
-
574
- g_hash_table_remove (mono_profiler_state .coverage_hash , method );
575
-
576
- coverage_unlock ();
577
-
578
- g_free (info );
579
- }
580
-
581
648
/**
582
649
* mono_profiler_enable_sampling:
583
650
*
@@ -972,21 +1039,6 @@ mono_profiler_cleanup (void)
972
1039
g_free (cur );
973
1040
}
974
1041
975
- if (mono_profiler_state .code_coverage ) {
976
- mono_os_mutex_destroy (& mono_profiler_state .coverage_mutex );
977
-
978
- GHashTableIter iter ;
979
-
980
- g_hash_table_iter_init (& iter , mono_profiler_state .coverage_hash );
981
-
982
- MonoProfilerCoverageInfo * info ;
983
-
984
- while (g_hash_table_iter_next (& iter , NULL , (gpointer * ) & info ))
985
- g_free (info );
986
-
987
- g_hash_table_destroy (mono_profiler_state .coverage_hash );
988
- }
989
-
990
1042
if (mono_profiler_state .sampling_owner )
991
1043
mono_os_sem_destroy (& mono_profiler_state .sampling_semaphore );
992
1044
}
0 commit comments