Merge pull request #1447 from chrisvire/bug-25102
[mono.git] / mono / metadata / sgen-gc.c
index 897b11af57dea98f91d3643c275fb5399f25fd12..1ba2027c1a4ce23178f61339c92fc45a611e4860 100644 (file)
@@ -567,8 +567,6 @@ static int mark_ephemerons_in_range (ScanCopyContext ctx);
 static void clear_unreachable_ephemerons (ScanCopyContext ctx);
 static void null_ephemerons_for_domain (MonoDomain *domain);
 
-static gboolean major_update_or_finish_concurrent_collection (gboolean force_finish);
-
 SgenObjectOperations current_object_ops;
 SgenMajorCollector major_collector;
 SgenMinorCollector sgen_minor_collector;
@@ -988,7 +986,7 @@ pin_objects_from_nursery_pin_queue (ScanCopyContext ctx)
                 * search_start must point to zeroed mem or point to an object.
                 */
                do {
-                       size_t obj_size;
+                       size_t obj_size, canarified_obj_size;
 
                        /* Skip zeros. */
                        if (!*(void**)search_start) {
@@ -997,22 +995,27 @@ pin_objects_from_nursery_pin_queue (ScanCopyContext ctx)
                                continue;
                        }
 
-                       obj_size = ALIGN_UP (safe_object_get_size ((MonoObject*)search_start));
-
-                       if (addr >= search_start && (char*)addr < (char*)search_start + obj_size) {
-                               /* This is the object we're looking for. */
-                               obj_to_pin = search_start;
-                               obj_to_pin_size = obj_size;
-                               break;
-                       }
+                       canarified_obj_size = obj_size = ALIGN_UP (safe_object_get_size ((MonoObject*)search_start));
 
-                       /* Skip to the next object */
+                       /*
+                        * Filler arrays are marked by an invalid sync word.  We don't
+                        * consider them for pinning.  They are not delimited by canaries,
+                        * either.
+                        */
                        if (((MonoObject*)search_start)->synchronisation != GINT_TO_POINTER (-1)) {
                                CHECK_CANARY_FOR_OBJECT (search_start);
-                               CANARIFY_SIZE (obj_size);
-                               CANARIFY_SIZE (obj_to_pin_size);
+                               CANARIFY_SIZE (canarified_obj_size);
+
+                               if (addr >= search_start && (char*)addr < (char*)search_start + obj_size) {
+                                       /* This is the object we're looking for. */
+                                       obj_to_pin = search_start;
+                                       obj_to_pin_size = canarified_obj_size;
+                                       break;
+                               }
                        }
-                       search_start = (void*)((char*)search_start + obj_size);
+
+                       /* Skip to the next object */
+                       search_start = (void*)((char*)search_start + canarified_obj_size);
                } while (search_start <= addr);
 
                /* We've searched past the address we were looking for. */