Fix null sessions in HttpContextWrapper.Session
[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                         DEBUG (9, if (__old != __copy) fprintf (gc_debug_file, "Overwrote field at %p with %p (was: %p)\n", (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 #undef HANDLE_PTR
86 #define HANDLE_PTR(ptr,obj)     do {    \
87                 void *__old = *(ptr);   \
88                 void *__copy;           \
89                 if (__old) {    \
90                         serial_copy_object ((ptr), queue);      \
91                         __copy = *(ptr);        \
92                         DEBUG (9, if (__old != __copy) fprintf (gc_debug_file, "Overwrote field at %p with %p (was: %p)\n", (ptr), *(ptr), __old));     \
93                         if (G_UNLIKELY (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)))) \
94                                 sgen_add_to_global_remset ((ptr));      \
95                 }       \
96         } while (0)
97
98 static void
99 serial_scan_object (char *start, SgenGrayQueue *queue)
100 {
101 #include "sgen-scan-object.h"
102
103         HEAVY_STAT (++stat_scan_object_called_nursery);
104 }
105
106 static void
107 serial_scan_vtype (char *start, mword desc, SgenGrayQueue *queue)
108 {
109         /* The descriptors include info about the MonoObject header as well */
110         start -= sizeof (MonoObject);
111
112 #define SCAN_OBJECT_NOVTABLE
113 #include "sgen-scan-object.h"
114 }
115
116 #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(collector)     do {                    \
117                 (collector)->parallel_ops.scan_object = parallel_scan_object;   \
118                 (collector)->parallel_ops.scan_vtype = parallel_scan_vtype;     \
119                 (collector)->serial_ops.scan_object = serial_scan_object;       \
120                 (collector)->serial_ops.scan_vtype = serial_scan_vtype; \
121         } while (0)