[sgen] Binary protocol entry for mod union cardtable markings
authorVlad Brezae <brezaevlad@gmail.com>
Mon, 9 Nov 2015 17:59:27 +0000 (19:59 +0200)
committerVlad Brezae <brezaevlad@gmail.com>
Mon, 7 Dec 2015 21:42:58 +0000 (23:42 +0200)
mono/metadata/sgen-client-mono.h
mono/sgen/sgen-marksweep-drain-gray-stack.h
mono/sgen/sgen-marksweep.c
mono/sgen/sgen-protocol-def.h

index ab0cedf6ad6d6fa1a27749b87a43bd9788bb3da2..0ba15a0b37b45ee6983eec7e7f2cf5b57a2673e3 100644 (file)
@@ -560,6 +560,11 @@ sgen_client_binary_protocol_global_remset (gpointer ptr, gpointer value, gpointe
 #endif
 }
 
+static void G_GNUC_UNUSED
+sgen_client_binary_protocol_mod_union_remset (gpointer obj, gpointer ptr, gpointer value, gpointer value_vtable)
+{
+}
+
 static void G_GNUC_UNUSED
 sgen_client_binary_protocol_ptr_update (gpointer ptr, gpointer old_value, gpointer new_value, gpointer vtable, size_t size)
 {
index d2f0893520d44b1c99dc6d3ce9d75261ba968da7..c459a5b264c537da868921bd7d1a482c6b09c396 100644 (file)
@@ -229,14 +229,14 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ
                        if (G_UNLIKELY (!sgen_ptr_in_nursery (ptr) &&   \
                                        sgen_safe_object_is_small (__old, sgen_obj_get_descriptor (__old) & DESC_TYPE_MASK) && \
                                        major_block_is_evacuating (block))) { \
-                               mark_mod_union_card ((full_object), (void**)(ptr)); \
+                               mark_mod_union_card ((full_object), (void**)(ptr), __old); \
                        } else {                                        \
                                PREFETCH_READ (__old);                  \
                                COPY_OR_MARK_FUNCTION_NAME ((ptr), __old, queue); \
                        }                                               \
                } else {                                                \
                        if (G_UNLIKELY (sgen_ptr_in_nursery (__old) && !sgen_ptr_in_nursery ((ptr)))) \
-                               mark_mod_union_card ((full_object), (void**)(ptr)); \
+                               mark_mod_union_card ((full_object), (void**)(ptr), __old); \
                        }                                               \
                } while (0)
 #else
index 0627d50193607b4b6e52561d6fa0d65d6e20ae96..9cbf2e8eda0215219a6ab9c61a97158674574d37 100644 (file)
@@ -1065,7 +1065,7 @@ major_get_cardtable_mod_union_for_reference (char *ptr)
  * Mark the mod-union card for `ptr`, which must be a reference within the object `obj`.
  */
 static void
-mark_mod_union_card (GCObject *obj, void **ptr)
+mark_mod_union_card (GCObject *obj, void **ptr, GCObject *value_obj)
 {
        int type = sgen_obj_get_descriptor (obj) & DESC_TYPE_MASK;
        if (sgen_safe_object_is_small (obj, type)) {
@@ -1075,6 +1075,8 @@ mark_mod_union_card (GCObject *obj, void **ptr)
        } else {
                sgen_los_mark_mod_union_card (obj, ptr);
        }
+
+       binary_protocol_mod_union_remset (obj, ptr, value_obj, SGEN_LOAD_VTABLE (value_obj));
 }
 
 static inline gboolean
index 91094fdc1aeea4dac629e7befa0acff6bd5edf1b..94acad1f56f8805235498ee88afb68161273bed0 100644 (file)
@@ -372,6 +372,13 @@ MATCH_INDEX (ptr == entry->cursor ? 1 : ptr == entry->value ? 2 : BINARY_PROTOCO
 IS_VTABLE_MATCH (FALSE)
 END_PROTOCOL_ENTRY_HEAVY
 
+BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_mod_union_remset, TYPE_POINTER, obj, TYPE_POINTER, ptr, TYPE_POINTER, value, TYPE_POINTER, value_vtable)
+DEFAULT_PRINT ()
+IS_ALWAYS_MATCH (FALSE)
+MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->ptr ? 1 : ptr == entry->value ? 2 : BINARY_PROTOCOL_NO_MATCH)
+IS_VTABLE_MATCH (ptr == entry->value_vtable)
+END_PROTOCOL_ENTRY_HEAVY
+
 #undef BEGIN_PROTOCOL_ENTRY0
 #undef BEGIN_PROTOCOL_ENTRY1
 #undef BEGIN_PROTOCOL_ENTRY2