[sgen] Add scan/copy context for the simple parallel nursery
[mono.git] / mono / sgen / sgen-simple-nursery.c
1 /**
2  * \file
3  * Simple always promote nursery.
4  *
5  * Copyright 2001-2003 Ximian, Inc
6  * Copyright 2003-2010 Novell, Inc.
7  * Copyright 2011 Xamarin Inc (http://www.xamarin.com)
8  * Copyright (C) 2012 Xamarin Inc
9  *
10  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
11  */
12
13 #include "config.h"
14 #ifdef HAVE_SGEN_GC
15
16 #include <string.h>
17
18 #include "mono/sgen/sgen-gc.h"
19 #include "mono/sgen/sgen-protocol.h"
20 #include "mono/sgen/sgen-layout-stats.h"
21 #include "mono/sgen/sgen-client.h"
22 #include "mono/utils/mono-memory-model.h"
23
24 static inline GCObject*
25 alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references)
26 {
27         total_promoted_size += objsize;
28         return major_collector.alloc_object (vtable, objsize, has_references);
29 }
30
31 static SgenFragment*
32 build_fragments_get_exclude_head (void)
33 {
34         return NULL;
35 }
36
37 static void
38 build_fragments_release_exclude_head (void)
39 {
40 }
41
42 static void
43 build_fragments_finish (SgenFragmentAllocator *allocator)
44 {
45 }
46
47 static void
48 prepare_to_space (char *to_space_bitmap, size_t space_bitmap_size)
49 {
50 }
51
52 static void
53 clear_fragments (void)
54 {       
55 }
56
57 static void
58 init_nursery (SgenFragmentAllocator *allocator, char *start, char *end)
59 {
60         sgen_fragment_allocator_add (allocator, start, end);
61 }
62
63
64 /******************************************Copy/Scan functins ************************************************/
65
66 #define collector_pin_object(obj, queue) sgen_pin_object (obj, queue);
67 #define COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION alloc_for_promotion
68
69 #define COPY_OR_MARK_PARALLEL
70 #include "sgen-copy-object.h"
71
72 #define SGEN_SIMPLE_NURSERY
73
74 #include "sgen-minor-copy-object.h"
75 #include "sgen-minor-scan-object.h"
76
77 static void
78 fill_serial_ops (SgenObjectOperations *ops)
79 {
80         ops->copy_or_mark_object = SERIAL_COPY_OBJECT;
81         FILL_MINOR_COLLECTOR_SCAN_OBJECT (ops);
82 }
83
84 #define SGEN_SIMPLE_PAR_NURSERY
85
86 #include "sgen-minor-copy-object.h"
87 #include "sgen-minor-scan-object.h"
88
89 static void
90 fill_parallel_ops (SgenObjectOperations *ops)
91 {
92         ops->copy_or_mark_object = SERIAL_COPY_OBJECT;
93         FILL_MINOR_COLLECTOR_SCAN_OBJECT (ops);
94 }
95
96 #undef SGEN_SIMPLE_PAR_NURSERY
97 #define SGEN_CONCURRENT_MAJOR
98
99 #include "sgen-minor-copy-object.h"
100 #include "sgen-minor-scan-object.h"
101
102 static void
103 fill_serial_with_concurrent_major_ops (SgenObjectOperations *ops)
104 {
105         ops->copy_or_mark_object = SERIAL_COPY_OBJECT;
106         FILL_MINOR_COLLECTOR_SCAN_OBJECT (ops);
107 }
108
109 void
110 sgen_simple_nursery_init (SgenMinorCollector *collector, gboolean parallel)
111 {
112         collector->is_split = FALSE;
113         collector->is_parallel = parallel;
114
115         collector->alloc_for_promotion = alloc_for_promotion;
116
117         collector->prepare_to_space = prepare_to_space;
118         collector->clear_fragments = clear_fragments;
119         collector->build_fragments_get_exclude_head = build_fragments_get_exclude_head;
120         collector->build_fragments_release_exclude_head = build_fragments_release_exclude_head;
121         collector->build_fragments_finish = build_fragments_finish;
122         collector->init_nursery = init_nursery;
123
124         fill_serial_ops (&collector->serial_ops);
125         fill_serial_with_concurrent_major_ops (&collector->serial_ops_with_concurrent_major);
126         fill_parallel_ops (&collector->parallel_ops);
127 }
128
129
130 #endif