@@ -59,6 +59,7 @@ void *pthread_get_stackaddr_np(pthread_t);
59
59
#define MIN_BOEHM_MAX_HEAP_SIZE (MIN_BOEHM_MAX_HEAP_SIZE_IN_MB << 20)
60
60
61
61
static gboolean gc_initialized = FALSE;
62
+ static gboolean gc_strict_wbarriers = FALSE;
62
63
static mono_mutex_t mono_gc_lock ;
63
64
64
65
typedef void (* GC_push_other_roots_proc )(void );
@@ -247,7 +248,10 @@ mono_gc_base_init (void)
247
248
#endif
248
249
}
249
250
continue ;
250
- } else {
251
+ } else if (g_str_has_prefix (opt , "strict-wbarriers" )) {
252
+ gc_strict_wbarriers = TRUE;
253
+ continue ;
254
+ }else {
251
255
/* Could be a parameter for sgen */
252
256
/*
253
257
fprintf (stderr, "MONO_GC_PARAMS must be a comma-delimited list of one or more of the following:\n");
@@ -273,6 +277,24 @@ mono_gc_base_init (void)
273
277
gc_initialized = TRUE;
274
278
}
275
279
280
+ void
281
+ mono_gc_dirty (void * * ptr )
282
+ {
283
+ GC_dirty (ptr );
284
+ }
285
+
286
+ void
287
+ mono_gc_dirty_range (void * * ptr , size_t size )
288
+ {
289
+ if (G_UNLIKELY (gc_strict_wbarriers ))
290
+ {
291
+ for (int i = 0 ; i < size /sizeof (void * ); i ++ )
292
+ GC_dirty (ptr + i );
293
+ }
294
+ else
295
+ GC_dirty (ptr );
296
+ }
297
+
276
298
void
277
299
mono_gc_base_cleanup (void )
278
300
{
@@ -647,7 +669,7 @@ mono_gc_weak_link_add (void **link_addr, MonoObject *obj, gboolean track)
647
669
{
648
670
/* libgc requires that we use HIDE_POINTER... */
649
671
* link_addr = (void * )HIDE_POINTER (obj );
650
- GC_dirty (link_addr );
672
+ mono_gc_dirty (link_addr );
651
673
if (track )
652
674
GC_REGISTER_LONG_LINK (link_addr , obj );
653
675
else
@@ -892,57 +914,60 @@ void
892
914
mono_gc_wbarrier_set_field (MonoObject * obj , gpointer field_ptr , MonoObject * value )
893
915
{
894
916
* (void * * )field_ptr = value ;
895
- GC_dirty (field_ptr );
917
+ mono_gc_dirty (field_ptr );
896
918
}
897
919
898
920
void
899
921
mono_gc_wbarrier_set_arrayref (MonoArray * arr , gpointer slot_ptr , MonoObject * value )
900
922
{
901
923
* (void * * )slot_ptr = value ;
902
- GC_dirty (slot_ptr );
924
+ mono_gc_dirty (slot_ptr );
903
925
}
904
926
905
927
void
906
928
mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr , gpointer src_ptr , int count )
907
929
{
908
930
mono_gc_memmove_aligned (dest_ptr , src_ptr , count * sizeof (gpointer ));
909
- GC_dirty (dest_ptr );
931
+ mono_gc_dirty_range (dest_ptr , count * sizeof ( gpointer ) );
910
932
}
911
933
912
934
void
913
935
mono_gc_wbarrier_generic_store (gpointer ptr , MonoObject * value )
914
936
{
915
937
* (void * * )ptr = value ;
916
- GC_dirty (ptr );
938
+ mono_gc_dirty (ptr );
917
939
}
918
940
919
941
void
920
942
mono_gc_wbarrier_generic_store_atomic (gpointer ptr , MonoObject * value )
921
943
{
922
944
mono_atomic_store_ptr ((volatile gpointer * )ptr , value );
923
- GC_dirty (ptr );
945
+ mono_gc_dirty (ptr );
924
946
}
925
947
926
948
void
927
949
mono_gc_wbarrier_generic_nostore (gpointer ptr )
928
950
{
929
- GC_dirty (ptr );
951
+ mono_gc_dirty (ptr );
930
952
}
931
953
932
954
void
933
955
mono_gc_wbarrier_value_copy (gpointer dest , gpointer src , int count , MonoClass * klass )
934
956
{
935
- mono_gc_memmove_atomic (dest , src , count * mono_class_value_size (klass , NULL ));
936
- GC_dirty (dest );
957
+ size_t size = count * mono_class_value_size (klass , NULL );
958
+ mono_gc_memmove_atomic (dest , src , size );
959
+ mono_gc_dirty_range (dest , size );
937
960
}
938
961
939
962
void
940
963
mono_gc_wbarrier_object_copy (MonoObject * obj , MonoObject * src )
941
964
{
942
965
/* do not copy the sync state */
943
- mono_gc_memmove_aligned ((char * )obj + sizeof (MonoObject ), (char * )src + sizeof (MonoObject ),
944
- mono_object_class (obj )-> instance_size - sizeof (MonoObject ));
945
- GC_dirty (obj );
966
+ size_t size = mono_object_class (obj )-> instance_size - sizeof (MonoObject );
967
+ char * dstPtr = (char * )obj + sizeof (MonoObject );
968
+ mono_gc_memmove_aligned (dstPtr , (char * )src + sizeof (MonoObject ),
969
+ size );
970
+ mono_gc_dirty_range ((void * * )dstPtr , size );
946
971
}
947
972
948
973
void
@@ -1514,7 +1539,7 @@ void
1514
1539
mono_gc_wbarrier_range_copy (gpointer _dest , gpointer _src , int size )
1515
1540
{
1516
1541
memcpy (_dest , _src , size );
1517
- GC_dirty (_dest );
1542
+ mono_gc_dirty_range (_dest , size );
1518
1543
}
1519
1544
1520
1545
void *
@@ -1875,7 +1900,7 @@ handle_data_grow (HandleData *handles, gboolean track)
1875
1900
gpointer * entries ;
1876
1901
entries = (void * * )mono_gc_alloc_fixed (sizeof (* handles -> entries ) * new_size , NULL , MONO_ROOT_SOURCE_GC_HANDLE , NULL , "GC Handle Table (Boehm)" );
1877
1902
mono_gc_memmove_aligned (entries , handles -> entries , sizeof (* handles -> entries ) * handles -> size );
1878
- GC_dirty (entries );
1903
+ mono_gc_dirty_range (entries , new_size * sizeof ( * handles -> entries ) );
1879
1904
mono_gc_free_fixed (handles -> entries );
1880
1905
handles -> entries = entries ;
1881
1906
}
@@ -1908,7 +1933,7 @@ alloc_handle (HandleData *handles, MonoObject *obj, gboolean track)
1908
1933
mono_gc_weak_link_add (& (handles -> entries [slot ]), obj , track );
1909
1934
} else {
1910
1935
handles -> entries [slot ] = obj ;
1911
- GC_dirty (handles -> entries + slot );
1936
+ mono_gc_dirty (handles -> entries + slot );
1912
1937
}
1913
1938
1914
1939
#ifndef DISABLE_PERFCOUNTERS
@@ -2026,7 +2051,7 @@ mono_gchandle_set_target (guint32 gchandle, MonoObject *obj)
2026
2051
handles -> domain_ids [slot ] = (obj ? mono_object_get_domain (obj ) : mono_domain_get ())-> domain_id ;
2027
2052
} else {
2028
2053
handles -> entries [slot ] = obj ;
2029
- GC_dirty (handles -> entries + slot );
2054
+ mono_gc_dirty (handles -> entries + slot );
2030
2055
}
2031
2056
} else {
2032
2057
/* print a warning? */
@@ -2105,7 +2130,7 @@ mono_gchandle_free (guint32 gchandle)
2105
2130
mono_gc_weak_link_remove (& handles -> entries [slot ], handles -> type == HANDLE_WEAK_TRACK );
2106
2131
} else {
2107
2132
handles -> entries [slot ] = NULL ;
2108
- GC_dirty (handles -> entries + slot );
2133
+ mono_gc_dirty (handles -> entries + slot );
2109
2134
}
2110
2135
vacate_slot (handles , slot );
2111
2136
} else {
@@ -2148,7 +2173,7 @@ mono_gchandle_free_domain (MonoDomain *domain)
2148
2173
if (handles -> entries [slot ] && mono_object_domain (handles -> entries [slot ]) == domain ) {
2149
2174
vacate_slot (handles , slot );
2150
2175
handles -> entries [slot ] = NULL ;
2151
- GC_dirty (handles -> entries + slot );
2176
+ mono_gc_dirty (handles -> entries + slot );
2152
2177
}
2153
2178
}
2154
2179
}
0 commit comments