Fix a case missed by 7e222739db7192eb0c5ec17cad18e309482e71b4.
[mono.git] / mono / metadata / sgen-minor-scan-object.h
1 /*
2  * Copyright 2001-2003 Ximian, Inc
3  * Copyright 2003-2010 Novell, Inc.
4  * 
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  * 
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  * 
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 extern long long stat_scan_object_called_nursery;
25
26 #if defined(SGEN_SIMPLE_NURSERY)
27 #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object
28 #define SERIAL_SCAN_VTYPE simple_nursery_serial_scan_vtype
29 #define PARALLEL_SCAN_OBJECT simple_nursery_parallel_scan_object
30 #define PARALLEL_SCAN_VTYPE simple_nursery_parallel_scan_vtype
31
32 #elif defined (SGEN_SPLIT_NURSERY)
33 #define SERIAL_SCAN_OBJECT split_nursery_serial_scan_object
34 #define SERIAL_SCAN_VTYPE split_nursery_serial_scan_vtype
35 #define PARALLEL_SCAN_OBJECT split_nursery_parallel_scan_object
36 #define PARALLEL_SCAN_VTYPE split_nursery_parallel_scan_vtype
37
38 #else
39 #error "Please define GC_CONF_NAME"
40 #endif
41
42 #undef HANDLE_PTR
43 #define HANDLE_PTR(ptr,obj)     do {    \
44                 void *__old = *(ptr);   \
45                 void *__copy;           \
46                 if (__old) {    \
47                         PARALLEL_COPY_OBJECT ((ptr), queue);    \
48                         __copy = *(ptr);        \
49                         SGEN_COND_LOG (9, __old != __copy, "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old);    \
50                         if (G_UNLIKELY (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)))) \
51                                 sgen_add_to_global_remset ((ptr));      \
52                 }       \
53         } while (0)
54
55 /*
56  * Scan the object pointed to by @start for references to
57  * other objects between @from_start and @from_end and copy
58  * them to the gray_objects area.
59  */
60 static void
61 PARALLEL_SCAN_OBJECT (char *start, SgenGrayQueue *queue)
62 {
63 #include "sgen-scan-object.h"
64
65         HEAVY_STAT (++stat_scan_object_called_nursery);
66 }
67
68 /*
69  * scan_vtype:
70  *
71  * Scan the valuetype pointed to by START, described by DESC for references to
72  * other objects between @from_start and @from_end and copy them to the gray_objects area.
73  * Returns a pointer to the end of the object.
74  */
75 static void
76 PARALLEL_SCAN_VTYPE (char *start, mword desc, SgenGrayQueue *queue)
77 {
78         /* The descriptors include info about the MonoObject header as well */
79         start -= sizeof (MonoObject);
80
81 #define SCAN_OBJECT_NOVTABLE
82 #include "sgen-scan-object.h"
83 }
84
85 #ifdef SGEN_SIMPLE_NURSERY
86 #define NEEDS_REMSET_COND(ptr) (__copy == __old && !sgen_ptr_in_nursery ((ptr)))
87 #else
88 #define NEEDS_REMSET_COND(ptr) (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)))
89 #endif
90
91 #undef HANDLE_PTR
92 /* Global remsets are handled in SERIAL_COPY_OBJECT_FROM_OBJ */
93 #define HANDLE_PTR(ptr,obj)     do {    \
94                 void *__old = *(ptr);   \
95                 void *__copy;           \
96                 if (__old) {    \
97                         SERIAL_COPY_OBJECT ((ptr), queue);      \
98                         __copy = *(ptr);        \
99                         if (G_UNLIKELY (NEEDS_REMSET_COND(ptr)))        \
100                                 sgen_add_to_global_remset ((ptr));      \
101                         SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \
102                 }       \
103         } while (0)
104
105 static void
106 SERIAL_SCAN_OBJECT (char *start, SgenGrayQueue *queue)
107 {
108 #include "sgen-scan-object.h"
109
110         HEAVY_STAT (++stat_scan_object_called_nursery);
111 }
112
113 static void
114 SERIAL_SCAN_VTYPE (char *start, mword desc, SgenGrayQueue *queue)
115 {
116         /* The descriptors include info about the MonoObject header as well */
117         start -= sizeof (MonoObject);
118
119 #define SCAN_OBJECT_NOVTABLE
120 #include "sgen-scan-object.h"
121 }
122
123 #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(collector)     do {                    \
124                 (collector)->parallel_ops.scan_object = PARALLEL_SCAN_OBJECT;   \
125                 (collector)->parallel_ops.scan_vtype = PARALLEL_SCAN_VTYPE;     \
126                 (collector)->serial_ops.scan_object = SERIAL_SCAN_OBJECT;       \
127                 (collector)->serial_ops.scan_vtype = SERIAL_SCAN_VTYPE; \
128         } while (0)