From: Mark Probst Date: Thu, 31 Mar 2016 03:55:48 +0000 (-0700) Subject: [sgen] Don't be too fussy about missing remsets to pinned objects. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=eef3e9acc462133ea09c80275387ede4b17d4cd5;p=mono.git [sgen] Don't be too fussy about missing remsets to pinned objects. 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. --- diff --git a/mono/sgen/sgen-debug.c b/mono/sgen/sgen-debug.c index 6daa9199dfc..7bda8fd3992 100644 --- a/mono/sgen/sgen-debug.c +++ b/mono/sgen/sgen-debug.c @@ -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) /*