2 * sgen-minor-scan-object.h: Object scanning in the nursery collectors.
4 * Copyright 2001-2003 Ximian, Inc
5 * Copyright 2003-2010 Novell, Inc.
6 * Copyright (C) 2012 Xamarin Inc
8 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
11 extern guint64 stat_scan_object_called_nursery;
13 #if defined(SGEN_SIMPLE_NURSERY)
14 #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object
15 #define SERIAL_SCAN_VTYPE simple_nursery_serial_scan_vtype
17 #elif defined (SGEN_SPLIT_NURSERY)
18 #define SERIAL_SCAN_OBJECT split_nursery_serial_scan_object
19 #define SERIAL_SCAN_VTYPE split_nursery_serial_scan_vtype
22 #error "Please define GC_CONF_NAME"
26 /* Global remsets are handled in SERIAL_COPY_OBJECT_FROM_OBJ */
27 #define HANDLE_PTR(ptr,obj) do { \
28 void *__old = *(ptr); \
29 SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \
30 binary_protocol_scan_process_reference ((full_object), (ptr), __old); \
32 SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue); \
33 SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \
38 SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
40 char *start = (char*)full_object;
42 SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
44 #ifdef HEAVY_STATISTICS
45 sgen_descriptor_count_scanned_object (desc);
48 SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
50 #define SCAN_OBJECT_PROTOCOL
51 #include "sgen-scan-object.h"
53 SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP;
54 HEAVY_STAT (++stat_scan_object_called_nursery);
58 SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
60 SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
62 SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
64 /* The descriptors include info about the MonoObject header as well */
65 start -= SGEN_CLIENT_OBJECT_HEADER_SIZE;
67 #define SCAN_OBJECT_NOVTABLE
68 #define SCAN_OBJECT_PROTOCOL
69 #include "sgen-scan-object.h"
73 SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *queue)
75 HANDLE_PTR (ptr, NULL);
78 #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(collector) do { \
79 (collector)->serial_ops.scan_object = SERIAL_SCAN_OBJECT; \
80 (collector)->serial_ops.scan_vtype = SERIAL_SCAN_VTYPE; \
81 (collector)->serial_ops.scan_ptr_field = SERIAL_SCAN_PTR_FIELD; \