Merge pull request #2408 from tastywheattasteslikechicken/MoreInterfaceSupport
[mono.git] / mono / sgen / sgen-minor-scan-object.h
1 /*
2  * sgen-minor-scan-object.h: Object scanning in the nursery collectors.
3  *
4  * Copyright 2001-2003 Ximian, Inc
5  * Copyright 2003-2010 Novell, Inc.
6  * Copyright (C) 2012 Xamarin Inc
7  *
8  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
9  */
10
11 extern guint64 stat_scan_object_called_nursery;
12
13 #undef SERIAL_SCAN_OBJECT
14 #undef SERIAL_SCAN_VTYPE
15 #undef SERIAL_SCAN_PTR_FIELD
16
17 #if defined(SGEN_SIMPLE_NURSERY)
18
19 #ifdef SGEN_CONCURRENT_MAJOR
20 #define SERIAL_SCAN_OBJECT simple_nursery_serial_with_concurrent_major_scan_object
21 #define SERIAL_SCAN_VTYPE simple_nursery_serial_with_concurrent_major_scan_vtype
22 #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_with_concurrent_major_scan_ptr_field
23 #else
24 #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object
25 #define SERIAL_SCAN_VTYPE simple_nursery_serial_scan_vtype
26 #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_scan_ptr_field
27 #endif
28
29 #elif defined (SGEN_SPLIT_NURSERY)
30
31 #ifdef SGEN_CONCURRENT_MAJOR
32 #define SERIAL_SCAN_OBJECT split_nursery_serial_with_concurrent_major_scan_object
33 #define SERIAL_SCAN_VTYPE split_nursery_serial_with_concurrent_major_scan_vtype
34 #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_with_concurrent_major_scan_ptr_field
35 #else
36 #define SERIAL_SCAN_OBJECT split_nursery_serial_scan_object
37 #define SERIAL_SCAN_VTYPE split_nursery_serial_scan_vtype
38 #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_scan_ptr_field
39 #endif
40
41 #else
42 #error "No nursery configuration specified"
43 #endif
44
45 #undef HANDLE_PTR
46 /* Global remsets are handled in SERIAL_COPY_OBJECT_FROM_OBJ */
47 #define HANDLE_PTR(ptr,obj)     do {    \
48                 void *__old = *(ptr);   \
49                 SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \
50                 binary_protocol_scan_process_reference ((full_object), (ptr), __old); \
51                 if (__old) {    \
52                         SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue);     \
53                         SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \
54                 }       \
55         } while (0)
56
57 static void
58 SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
59 {
60         char *start = (char*)full_object;
61
62         SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
63
64 #ifdef HEAVY_STATISTICS
65         sgen_descriptor_count_scanned_object (desc);
66 #endif
67
68         SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
69
70 #define SCAN_OBJECT_PROTOCOL
71 #include "sgen-scan-object.h"
72
73         SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP;
74         HEAVY_STAT (++stat_scan_object_called_nursery);
75 }
76
77 static void
78 SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
79 {
80         SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
81
82         SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
83
84         /* The descriptors include info about the MonoObject header as well */
85         start -= SGEN_CLIENT_OBJECT_HEADER_SIZE;
86
87 #define SCAN_OBJECT_NOVTABLE
88 #define SCAN_OBJECT_PROTOCOL
89 #include "sgen-scan-object.h"
90 }
91
92 static void
93 SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *queue)
94 {
95         HANDLE_PTR (ptr, NULL);
96 }
97
98 #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(ops)   do {                    \
99                 (ops)->scan_object = SERIAL_SCAN_OBJECT;                        \
100                 (ops)->scan_vtype = SERIAL_SCAN_VTYPE;                  \
101                 (ops)->scan_ptr_field = SERIAL_SCAN_PTR_FIELD;          \
102         } while (0)