|
1 | 1 | use super::{OpenJDK, UPCALLS};
|
2 |
| -use crate::scanning::create_process_edges_work; |
3 | 2 | use mmtk::scheduler::*;
|
| 3 | +use mmtk::vm::RootsWorkFactory; |
4 | 4 | use mmtk::MMTK;
|
5 |
| -use std::marker::PhantomData; |
6 |
| - |
7 |
| -pub struct ScanUniverseRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
8 |
| - |
9 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanUniverseRoots<E> { |
10 |
| - pub fn new() -> Self { |
11 |
| - Self(PhantomData) |
12 |
| - } |
13 |
| -} |
14 |
| - |
15 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanUniverseRoots<E> { |
16 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
17 |
| - unsafe { |
18 |
| - ((*UPCALLS).scan_universe_roots)(create_process_edges_work::<E> as _); |
19 |
| - } |
20 |
| - } |
21 |
| -} |
22 |
| - |
23 |
| -pub struct ScanJNIHandlesRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
24 |
| - |
25 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanJNIHandlesRoots<E> { |
26 |
| - pub fn new() -> Self { |
27 |
| - Self(PhantomData) |
28 |
| - } |
29 |
| -} |
30 |
| - |
31 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanJNIHandlesRoots<E> { |
32 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
33 |
| - unsafe { |
34 |
| - ((*UPCALLS).scan_jni_handle_roots)(create_process_edges_work::<E> as _); |
35 |
| - } |
36 |
| - } |
37 |
| -} |
38 |
| - |
39 |
| -pub struct ScanObjectSynchronizerRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
40 |
| - |
41 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanObjectSynchronizerRoots<E> { |
42 |
| - pub fn new() -> Self { |
43 |
| - Self(PhantomData) |
44 |
| - } |
45 |
| -} |
46 |
| - |
47 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanObjectSynchronizerRoots<E> { |
48 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
49 |
| - unsafe { |
50 |
| - ((*UPCALLS).scan_object_synchronizer_roots)(create_process_edges_work::<E> as _); |
51 |
| - } |
52 |
| - } |
53 |
| -} |
54 |
| - |
55 |
| -pub struct ScanManagementRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
56 |
| - |
57 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanManagementRoots<E> { |
58 |
| - pub fn new() -> Self { |
59 |
| - Self(PhantomData) |
60 |
| - } |
61 |
| -} |
62 |
| - |
63 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanManagementRoots<E> { |
64 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
65 |
| - unsafe { |
66 |
| - ((*UPCALLS).scan_management_roots)(create_process_edges_work::<E> as _); |
67 |
| - } |
68 |
| - } |
69 |
| -} |
70 |
| - |
71 |
| -pub struct ScanJvmtiExportRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
72 |
| - |
73 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanJvmtiExportRoots<E> { |
74 |
| - pub fn new() -> Self { |
75 |
| - Self(PhantomData) |
76 |
| - } |
77 |
| -} |
78 |
| - |
79 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanJvmtiExportRoots<E> { |
80 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
81 |
| - unsafe { |
82 |
| - ((*UPCALLS).scan_jvmti_export_roots)(create_process_edges_work::<E> as _); |
83 |
| - } |
84 |
| - } |
85 |
| -} |
86 |
| - |
87 |
| -pub struct ScanAOTLoaderRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
88 |
| - |
89 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanAOTLoaderRoots<E> { |
90 |
| - pub fn new() -> Self { |
91 |
| - Self(PhantomData) |
92 |
| - } |
93 |
| -} |
94 |
| - |
95 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanAOTLoaderRoots<E> { |
96 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
97 |
| - unsafe { |
98 |
| - ((*UPCALLS).scan_aot_loader_roots)(create_process_edges_work::<E> as _); |
99 |
| - } |
100 |
| - } |
101 |
| -} |
102 |
| - |
103 |
| -pub struct ScanSystemDictionaryRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
104 |
| - |
105 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanSystemDictionaryRoots<E> { |
106 |
| - pub fn new() -> Self { |
107 |
| - Self(PhantomData) |
108 |
| - } |
109 |
| -} |
110 |
| - |
111 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanSystemDictionaryRoots<E> { |
112 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
113 |
| - unsafe { |
114 |
| - ((*UPCALLS).scan_system_dictionary_roots)(create_process_edges_work::<E> as _); |
115 |
| - } |
116 |
| - } |
117 |
| -} |
118 |
| - |
119 |
| -pub struct ScanCodeCacheRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
120 |
| - |
121 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanCodeCacheRoots<E> { |
122 |
| - pub fn new() -> Self { |
123 |
| - Self(PhantomData) |
124 |
| - } |
125 |
| -} |
126 |
| - |
127 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanCodeCacheRoots<E> { |
128 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
129 |
| - unsafe { |
130 |
| - ((*UPCALLS).scan_code_cache_roots)(create_process_edges_work::<E> as _); |
131 |
| - } |
132 |
| - } |
133 |
| -} |
134 |
| - |
135 |
| -pub struct ScanStringTableRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
136 |
| - |
137 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanStringTableRoots<E> { |
138 |
| - pub fn new() -> Self { |
139 |
| - Self(PhantomData) |
140 |
| - } |
141 |
| -} |
142 |
| - |
143 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanStringTableRoots<E> { |
144 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
145 |
| - unsafe { |
146 |
| - ((*UPCALLS).scan_string_table_roots)(create_process_edges_work::<E> as _); |
147 |
| - } |
148 |
| - } |
149 |
| -} |
150 |
| - |
151 |
| -pub struct ScanClassLoaderDataGraphRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
152 |
| - |
153 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanClassLoaderDataGraphRoots<E> { |
154 |
| - pub fn new() -> Self { |
155 |
| - Self(PhantomData) |
156 |
| - } |
157 |
| -} |
158 |
| - |
159 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanClassLoaderDataGraphRoots<E> { |
160 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
161 |
| - unsafe { |
162 |
| - ((*UPCALLS).scan_class_loader_data_graph_roots)(create_process_edges_work::<E> as _); |
163 |
| - } |
164 |
| - } |
165 |
| -} |
166 |
| - |
167 |
| -pub struct ScanWeakProcessorRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
168 |
| - |
169 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanWeakProcessorRoots<E> { |
170 |
| - pub fn new() -> Self { |
171 |
| - Self(PhantomData) |
172 |
| - } |
173 |
| -} |
174 |
| - |
175 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanWeakProcessorRoots<E> { |
176 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
177 |
| - unsafe { |
178 |
| - ((*UPCALLS).scan_weak_processor_roots)(create_process_edges_work::<E> as _); |
179 |
| - } |
180 |
| - } |
181 |
| -} |
182 |
| - |
183 |
| -pub struct ScanVMThreadRoots<E: ProcessEdgesWork<VM = OpenJDK>>(PhantomData<E>); |
184 |
| - |
185 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> ScanVMThreadRoots<E> { |
186 |
| - pub fn new() -> Self { |
187 |
| - Self(PhantomData) |
188 |
| - } |
189 |
| -} |
190 |
| - |
191 |
| -impl<E: ProcessEdgesWork<VM = OpenJDK>> GCWork<OpenJDK> for ScanVMThreadRoots<E> { |
192 |
| - fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
193 |
| - unsafe { |
194 |
| - ((*UPCALLS).scan_vm_thread_roots)(create_process_edges_work::<E> as _); |
195 |
| - } |
196 |
| - } |
197 |
| -} |
| 5 | +use scanning::to_edges_closure; |
| 6 | + |
| 7 | +macro_rules! scan_roots_work { |
| 8 | + ($struct_name: ident, $func_name: ident) => { |
| 9 | + pub struct $struct_name<F: RootsWorkFactory> { |
| 10 | + factory: F, |
| 11 | + } |
| 12 | + |
| 13 | + impl<F: RootsWorkFactory> $struct_name<F> { |
| 14 | + pub fn new(factory: F) -> Self { |
| 15 | + Self { factory } |
| 16 | + } |
| 17 | + } |
| 18 | + |
| 19 | + impl<F: RootsWorkFactory> GCWork<OpenJDK> for $struct_name<F> { |
| 20 | + fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) { |
| 21 | + unsafe { |
| 22 | + ((*UPCALLS).$func_name)(to_edges_closure(&mut self.factory)); |
| 23 | + } |
| 24 | + } |
| 25 | + } |
| 26 | + }; |
| 27 | +} |
| 28 | + |
| 29 | +scan_roots_work!(ScanUniverseRoots, scan_universe_roots); |
| 30 | +scan_roots_work!(ScanJNIHandlesRoots, scan_jni_handle_roots); |
| 31 | +scan_roots_work!(ScanObjectSynchronizerRoots, scan_object_synchronizer_roots); |
| 32 | +scan_roots_work!(ScanManagementRoots, scan_management_roots); |
| 33 | +scan_roots_work!(ScanJvmtiExportRoots, scan_jvmti_export_roots); |
| 34 | +scan_roots_work!(ScanAOTLoaderRoots, scan_aot_loader_roots); |
| 35 | +scan_roots_work!(ScanSystemDictionaryRoots, scan_system_dictionary_roots); |
| 36 | +scan_roots_work!(ScanCodeCacheRoots, scan_code_cache_roots); |
| 37 | +scan_roots_work!(ScanStringTableRoots, scan_string_table_roots); |
| 38 | +scan_roots_work!( |
| 39 | + ScanClassLoaderDataGraphRoots, |
| 40 | + scan_class_loader_data_graph_roots |
| 41 | +); |
| 42 | +scan_roots_work!(ScanWeakProcessorRoots, scan_weak_processor_roots); |
| 43 | +scan_roots_work!(ScanVMThreadRoots, scan_vm_thread_roots); |
0 commit comments