3 * Object scanning in the nursery collectors.
5 * Copyright 2001-2003 Ximian, Inc
6 * Copyright 2003-2010 Novell, Inc.
7 * Copyright (C) 2012 Xamarin Inc
9 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
12 extern guint64 stat_scan_object_called_nursery;
14 #undef SERIAL_SCAN_OBJECT
15 #undef SERIAL_SCAN_VTYPE
16 #undef SERIAL_SCAN_PTR_FIELD
17 #undef SERIAL_DRAIN_GRAY_STACK
19 #if defined(SGEN_SIMPLE_NURSERY)
21 #ifdef SGEN_CONCURRENT_MAJOR
22 #define SERIAL_SCAN_OBJECT simple_nursery_serial_with_concurrent_major_scan_object
23 #define SERIAL_SCAN_VTYPE simple_nursery_serial_with_concurrent_major_scan_vtype
24 #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_with_concurrent_major_scan_ptr_field
25 #define SERIAL_DRAIN_GRAY_STACK simple_nursery_serial_with_concurrent_major_drain_gray_stack
27 #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object
28 #define SERIAL_SCAN_VTYPE simple_nursery_serial_scan_vtype
29 #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_scan_ptr_field
30 #define SERIAL_DRAIN_GRAY_STACK simple_nursery_serial_drain_gray_stack
33 #elif defined (SGEN_SPLIT_NURSERY)
35 #ifdef SGEN_CONCURRENT_MAJOR
36 #define SERIAL_SCAN_OBJECT split_nursery_serial_with_concurrent_major_scan_object
37 #define SERIAL_SCAN_VTYPE split_nursery_serial_with_concurrent_major_scan_vtype
38 #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_with_concurrent_major_scan_ptr_field
39 #define SERIAL_DRAIN_GRAY_STACK split_nursery_serial_with_concurrent_major_drain_gray_stack
41 #define SERIAL_SCAN_OBJECT split_nursery_serial_scan_object
42 #define SERIAL_SCAN_VTYPE split_nursery_serial_scan_vtype
43 #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_scan_ptr_field
44 #define SERIAL_DRAIN_GRAY_STACK split_nursery_serial_drain_gray_stack
48 #error "No nursery configuration specified"
52 /* Global remsets are handled in SERIAL_COPY_OBJECT_FROM_OBJ */
53 #define HANDLE_PTR(ptr,obj) do { \
54 void *__old = *(ptr); \
55 SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \
56 binary_protocol_scan_process_reference ((full_object), (ptr), __old); \
58 SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue); \
59 SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \
64 SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
66 char *start = (char*)full_object;
68 SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
70 #ifdef HEAVY_STATISTICS
71 sgen_descriptor_count_scanned_object (desc);
74 SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
76 #define SCAN_OBJECT_PROTOCOL
77 #include "sgen-scan-object.h"
79 SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP;
80 HEAVY_STAT (++stat_scan_object_called_nursery);
84 SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
86 SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
88 SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
90 /* The descriptors include info about the MonoObject header as well */
91 start -= SGEN_CLIENT_OBJECT_HEADER_SIZE;
93 #define SCAN_OBJECT_NOVTABLE
94 #define SCAN_OBJECT_PROTOCOL
95 #include "sgen-scan-object.h"
99 SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *queue)
101 HANDLE_PTR (ptr, NULL);
105 SERIAL_DRAIN_GRAY_STACK (SgenGrayQueue *queue)
111 GRAY_OBJECT_DEQUEUE_SERIAL (queue, &obj, &desc);
115 SERIAL_SCAN_OBJECT (obj, desc, queue);
119 #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(ops) do { \
120 (ops)->scan_object = SERIAL_SCAN_OBJECT; \
121 (ops)->scan_vtype = SERIAL_SCAN_VTYPE; \
122 (ops)->scan_ptr_field = SERIAL_SCAN_PTR_FIELD; \
123 (ops)->drain_gray_stack = SERIAL_DRAIN_GRAY_STACK; \