[sgen] Use write barrier for fields to set array references.
authorMark Probst <mark.probst@gmail.com>
Mon, 22 Dec 2014 23:49:40 +0000 (15:49 -0800)
committerMark Probst <mark.probst@gmail.com>
Wed, 29 Apr 2015 17:57:46 +0000 (10:57 -0700)
They do the same thing.

mono/metadata/sgen-cardtable.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/metadata/sgen-mono.c

index 532d3fb756b081b4cfb7eec82445666e12959687..db775a9fed26f5923ee5aa6e80f502ced1e9f660 100644 (file)
@@ -87,15 +87,6 @@ sgen_card_table_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObj
        sgen_dummy_use (value);
 }
 
-static void
-sgen_card_table_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
-{
-       *(void**)slot_ptr = value;
-       if (need_mod_union || sgen_ptr_in_nursery (value))
-               sgen_card_table_mark_address ((mword)slot_ptr);
-       sgen_dummy_use (value); 
-}
-
 static void
 sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count)
 {
@@ -610,7 +601,6 @@ sgen_card_table_init (SgenRememberedSet *remset)
 
 
        remset->wbarrier_set_field = sgen_card_table_wbarrier_set_field;
-       remset->wbarrier_set_arrayref = sgen_card_table_wbarrier_set_arrayref;
        remset->wbarrier_arrayref_copy = sgen_card_table_wbarrier_arrayref_copy;
        remset->wbarrier_value_copy = sgen_card_table_wbarrier_value_copy;
        remset->wbarrier_object_copy = sgen_card_table_wbarrier_object_copy;
index bb7ba7eb88ddeea87f313c1ff79e66a4e995f50e..fc00b61fb633a61afd5694be4bfe1ab1809fdbe2 100644 (file)
@@ -3388,21 +3388,6 @@ mono_gc_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* val
        remset.wbarrier_set_field (obj, field_ptr, value);
 }
 
-void
-mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
-{
-       HEAVY_STAT (++stat_wbarrier_set_arrayref);
-       if (ptr_in_nursery (slot_ptr)) {
-               *(void**)slot_ptr = value;
-               return;
-       }
-       SGEN_LOG (8, "Adding remset at %p", slot_ptr);
-       if (value)
-               binary_protocol_wbarrier (slot_ptr, value, value->vtable);
-
-       remset.wbarrier_set_arrayref (arr, slot_ptr, value);
-}
-
 void
 mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count)
 {
index 24b6a94989bbe0edb34e6d2c9b64522614e1e3e8..41298b405304808b7d02f66d46f16c1adddc386f 100644 (file)
@@ -727,7 +727,6 @@ SgenMajorCollector* sgen_get_major_collector (void);
 
 typedef struct _SgenRememberedSet {
        void (*wbarrier_set_field) (MonoObject *obj, gpointer field_ptr, MonoObject* value);
-       void (*wbarrier_set_arrayref) (MonoArray *arr, gpointer slot_ptr, MonoObject* value);
        void (*wbarrier_arrayref_copy) (gpointer dest_ptr, gpointer src_ptr, int count);
        void (*wbarrier_value_copy) (gpointer dest, gpointer src, int count, size_t element_size);
        void (*wbarrier_object_copy) (MonoObject* obj, MonoObject *src);
index e8a95564d2710bad7dfe7cf5d89e388b58d90d80..5938023e9f6a34d63231fc9a69a428ddb493ff8b 100644 (file)
@@ -127,6 +127,21 @@ mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
        sgen_get_remset ()->wbarrier_object_copy (obj, src);
 }
 
+void
+mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
+{
+       HEAVY_STAT (++stat_wbarrier_set_arrayref);
+       if (sgen_ptr_in_nursery (slot_ptr)) {
+               *(void**)slot_ptr = value;
+               return;
+       }
+       SGEN_LOG (8, "Adding remset at %p", slot_ptr);
+       if (value)
+               binary_protocol_wbarrier (slot_ptr, value, value->vtable);
+
+       sgen_get_remset ()->wbarrier_set_field ((MonoObject*)arr, slot_ptr, value);
+}
+
 /*
  * Dummy filler objects
  */