[sgen] Don't be too fussy about missing remsets to pinned objects.
authorMark Probst <mark.probst@gmail.com>
Thu, 31 Mar 2016 03:55:48 +0000 (20:55 -0700)
committerMark Probst <mark.probst@gmail.com>
Mon, 25 Jul 2016 17:52:59 +0000 (10:52 -0700)
If a thread is interrupted after a reference write but before the corresponding
write barrier, the remset will be missing, but the object will be pinned.

mono/sgen/sgen-debug.c

index 6daa9199dfcea5d7067518d98732a153cb5f6abc..7bda8fd39925b9978e4055e4d9ba0fed138c0a16 100644 (file)
@@ -149,15 +149,16 @@ static gboolean missing_remsets;
  */
 #undef HANDLE_PTR
 #define HANDLE_PTR(ptr,obj)    do {    \
-       if (*(ptr) && sgen_ptr_in_nursery ((char*)*(ptr))) { \
-               if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup (*(ptr))) { \
-                       GCVTable __vt = SGEN_LOAD_VTABLE (obj); \
-                       SGEN_LOG (0, "Oldspace->newspace reference %p at offset %zd in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), sgen_client_vtable_get_namespace (__vt), sgen_client_vtable_get_name (__vt)); \
-                       binary_protocol_missing_remset ((obj), __vt, (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \
-                       if (!object_is_pinned (*(ptr)))                                                         \
-                               missing_remsets = TRUE;                                                                 \
-               }                                                                                                                               \
-       }                                                                                                                                       \
+               if (*(ptr) && sgen_ptr_in_nursery ((char*)*(ptr))) {    \
+                       if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup (*(ptr))) { \
+                               GCVTable __vt = SGEN_LOAD_VTABLE (obj); \
+                               gboolean is_pinned = object_is_pinned (*(ptr)); \
+                               SGEN_LOG (0, "Oldspace->newspace reference %p at offset %zd in object %p (%s.%s) not found in remsets%s.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), sgen_client_vtable_get_namespace (__vt), sgen_client_vtable_get_name (__vt), is_pinned ? ", but object is pinned" : ""); \
+                               binary_protocol_missing_remset ((obj), __vt, (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), is_pinned); \
+                               if (!is_pinned)                         \
+                                       missing_remsets = TRUE;         \
+                       }                                               \
+               }                                                       \
        } while (0)
 
 /*