[sgen] Objects promoted during concurrent collections must be marked, too.
authorMark Probst <mark.probst@gmail.com>
Thu, 1 Nov 2012 13:00:51 +0000 (14:00 +0100)
committerMark Probst <mark.probst@gmail.com>
Sun, 9 Dec 2012 14:02:44 +0000 (15:02 +0100)
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/metadata/sgen-los.c
mono/metadata/sgen-marksweep.c

index 14889864a37499f66980f925abdfae0e68975bd1..b6f98ff4b69f5e96958e6b92f59dd3cf5925a26d 100644 (file)
@@ -577,18 +577,18 @@ sgen_workers_get_job_gray_queue (WorkerData *worker_data)
 
 static LOCK_DECLARE (workers_distribute_gray_queue_mutex);
 
-void
+gboolean
 sgen_remember_major_object_for_concurrent_mark (char *obj)
 {
        gboolean need_lock = current_collection_generation != GENERATION_NURSERY;
 
        if (!major_collector.is_concurrent)
-               return;
+               return FALSE;
 
        g_assert (current_collection_generation == GENERATION_NURSERY || current_collection_generation == -1);
 
        if (!concurrent_collection_in_progress)
-               return;
+               return FALSE;
 
        if (need_lock)
                mono_mutex_lock (&workers_distribute_gray_queue_mutex);
@@ -597,6 +597,8 @@ sgen_remember_major_object_for_concurrent_mark (char *obj)
 
        if (need_lock)
                mono_mutex_unlock (&workers_distribute_gray_queue_mutex);
+
+       return TRUE;
 }
 
 static gboolean
index 447bbcce597f215233d4ad3882287fbfc3d8e732..a5b484900d40b03302ef03506c031a4d325bc633 100644 (file)
@@ -548,7 +548,7 @@ gboolean sgen_collection_is_parallel (void) MONO_INTERNAL;
 gboolean sgen_collection_is_concurrent (void) MONO_INTERNAL;
 gboolean sgen_concurrent_collection_in_progress (void) MONO_INTERNAL;
 
-void sgen_remember_major_object_for_concurrent_mark (char *obj) MONO_INTERNAL;
+gboolean sgen_remember_major_object_for_concurrent_mark (char *obj) MONO_INTERNAL;
 
 typedef struct {
        CopyOrMarkObjectFunc copy_or_mark_object;
index a138d48270157edb9bf8100f5f03f0a48917b518..28432274e43d1d8d190c77bb80c5390eb6d8405a 100644 (file)
@@ -384,7 +384,8 @@ sgen_los_alloc_large_inner (MonoVTable *vtable, size_t size)
        los_consistency_check ();
 #endif
 
-       sgen_remember_major_object_for_concurrent_mark (obj->data);
+       if (sgen_remember_major_object_for_concurrent_mark (obj->data))
+               sgen_los_pin_object (obj->data);
 
        return obj->data;
 }
@@ -586,6 +587,7 @@ sgen_los_pin_object (char *data)
 {
        LOSObject *obj = sgen_los_header_for_object (data);
        obj->size = obj->size | 1;
+       binary_protocol_pin (data, (gpointer)SGEN_LOAD_VTABLE (data), sgen_safe_object_get_size ((MonoObject*)data));
 }
 
 void
index c42c742bb3cb014d41c5eb98b83c01e5dd275ece..05e4415585249cda57148d12ccbfe2a67ec0a5b5 100644 (file)
@@ -765,8 +765,13 @@ alloc_obj (int size, gboolean pinned, gboolean has_references)
        *(void**)obj = NULL;
 
 #ifdef SGEN_CONCURRENT_MARK
-        if (obj)
-                sgen_remember_major_object_for_concurrent_mark (obj);
+       if (obj && sgen_remember_major_object_for_concurrent_mark (obj)) {
+               MSBlockInfo *block = MS_BLOCK_FOR_OBJ (obj);
+               int word, bit;
+               MS_CALC_MARK_BIT (word, bit, obj);
+               MS_SET_MARK_BIT (block, word, bit);
+               binary_protocol_mark (obj, NULL, size);
+       }
 #endif
 
        return obj;
@@ -1315,7 +1320,6 @@ major_copy_or_mark_object (void **ptr, SgenGrayQueue *queue)
                } else {
                        if (sgen_los_object_is_pinned (obj))
                                return;
-                       binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj));
                        if (G_UNLIKELY (MONO_GC_OBJ_PINNED_ENABLED ())) {
                                MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
                                MONO_GC_OBJ_PINNED ((mword)obj, sgen_safe_object_get_size (obj), vt->klass->name_space, vt->klass->name, GENERATION_OLD);