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;
* 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) {
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. */