1
1
use super :: abi:: * ;
2
2
use super :: UPCALLS ;
3
- use crate :: { OpenJDK , SINGLETON } ;
4
- use mmtk:: scheduler:: ProcessEdgesWork ;
5
- use mmtk:: scheduler:: { GCWorker , WorkBucketStage } ;
6
3
use mmtk:: util:: constants:: * ;
7
4
use mmtk:: util:: opaque_pointer:: * ;
8
5
use mmtk:: util:: { Address , ObjectReference } ;
9
- use mmtk:: TransitiveClosure ;
10
- use std:: marker:: PhantomData ;
6
+ use mmtk:: vm:: EdgeVisitor ;
11
7
use std:: { mem, slice} ;
12
8
13
9
trait OopIterate : Sized {
14
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) ;
10
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) ;
15
11
}
16
12
17
13
impl OopIterate for OopMapBlock {
18
14
#[ inline]
19
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
15
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
20
16
let start = oop. get_field_address ( self . offset ) ;
21
17
for i in 0 ..self . count as usize {
22
18
let edge = start + ( i << LOG_BYTES_IN_ADDRESS ) ;
23
- closure. process_edge ( edge) ;
19
+ closure. visit_edge ( edge) ;
24
20
}
25
21
}
26
22
}
27
23
28
24
impl OopIterate for InstanceKlass {
29
25
#[ inline]
30
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
26
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
31
27
let oop_maps = self . nonstatic_oop_maps ( ) ;
32
28
for map in oop_maps {
33
29
map. oop_iterate ( oop, closure)
@@ -37,7 +33,7 @@ impl OopIterate for InstanceKlass {
37
33
38
34
impl OopIterate for InstanceMirrorKlass {
39
35
#[ inline]
40
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
36
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
41
37
self . instance_klass . oop_iterate ( oop, closure) ;
42
38
// if (Devirtualizer::do_metadata(closure)) {
43
39
// Klass* klass = java_lang_Class::as_Klass(obj);
@@ -71,14 +67,14 @@ impl OopIterate for InstanceMirrorKlass {
71
67
let len = Self :: static_oop_field_count ( oop) ;
72
68
let slice = unsafe { slice:: from_raw_parts ( start, len as _ ) } ;
73
69
for oop in slice {
74
- closure. process_edge ( Address :: from_ref ( oop as & Oop ) ) ;
70
+ closure. visit_edge ( Address :: from_ref ( oop as & Oop ) ) ;
75
71
}
76
72
}
77
73
}
78
74
79
75
impl OopIterate for InstanceClassLoaderKlass {
80
76
#[ inline]
81
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
77
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
82
78
self . instance_klass . oop_iterate ( oop, closure) ;
83
79
// if (Devirtualizer::do_metadata(closure)) {
84
80
// ClassLoaderData* cld = java_lang_ClassLoader::loader_data(obj);
@@ -92,42 +88,42 @@ impl OopIterate for InstanceClassLoaderKlass {
92
88
93
89
impl OopIterate for ObjArrayKlass {
94
90
#[ inline]
95
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
91
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
96
92
let array = unsafe { oop. as_array_oop ( ) } ;
97
93
for oop in unsafe { array. data :: < Oop > ( BasicType :: T_OBJECT ) } {
98
- closure. process_edge ( Address :: from_ref ( oop as & Oop ) ) ;
94
+ closure. visit_edge ( Address :: from_ref ( oop as & Oop ) ) ;
99
95
}
100
96
}
101
97
}
102
98
103
99
impl OopIterate for TypeArrayKlass {
104
100
#[ inline]
105
- fn oop_iterate ( & self , _oop : Oop , _closure : & mut impl TransitiveClosure ) {
101
+ fn oop_iterate ( & self , _oop : Oop , _closure : & mut impl EdgeVisitor ) {
106
102
// Performance tweak: We skip processing the klass pointer since all
107
103
// TypeArrayKlasses are guaranteed processed via the null class loader.
108
104
}
109
105
}
110
106
111
107
impl OopIterate for InstanceRefKlass {
112
108
#[ inline]
113
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl TransitiveClosure ) {
109
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
114
110
self . instance_klass . oop_iterate ( oop, closure) ;
115
111
let referent_addr = Self :: referent_address ( oop) ;
116
- closure. process_edge ( referent_addr) ;
112
+ closure. visit_edge ( referent_addr) ;
117
113
let discovered_addr = Self :: discovered_address ( oop) ;
118
- closure. process_edge ( discovered_addr) ;
114
+ closure. visit_edge ( discovered_addr) ;
119
115
}
120
116
}
121
117
122
118
#[ allow( unused) ]
123
- fn oop_iterate_slow ( oop : Oop , closure : & mut impl TransitiveClosure , tls : OpaquePointer ) {
119
+ fn oop_iterate_slow ( oop : Oop , closure : & mut impl EdgeVisitor , tls : OpaquePointer ) {
124
120
unsafe {
125
121
( ( * UPCALLS ) . scan_object ) ( closure as * mut _ as _ , mem:: transmute ( oop) , tls) ;
126
122
}
127
123
}
128
124
129
125
#[ inline]
130
- fn oop_iterate ( oop : Oop , closure : & mut impl TransitiveClosure ) {
126
+ fn oop_iterate ( oop : Oop , closure : & mut impl EdgeVisitor ) {
131
127
let klass_id = oop. klass . id ;
132
128
debug_assert ! (
133
129
klass_id as i32 >= 0 && ( klass_id as i32 ) < 6 ,
@@ -164,68 +160,11 @@ fn oop_iterate(oop: Oop, closure: &mut impl TransitiveClosure) {
164
160
}
165
161
166
162
#[ inline]
167
- pub fn scan_object (
168
- object : ObjectReference ,
169
- closure : & mut impl TransitiveClosure ,
170
- _tls : VMWorkerThread ,
171
- ) {
163
+ pub fn scan_object ( object : ObjectReference , closure : & mut impl EdgeVisitor , _tls : VMWorkerThread ) {
172
164
// println!("*****scan_object(0x{:x}) -> \n 0x{:x}, 0x{:x} \n",
173
165
// object,
174
166
// unsafe { *(object.value() as *const usize) },
175
167
// unsafe { *((object.value() + 8) as *const usize) }
176
168
// );
177
169
unsafe { oop_iterate ( mem:: transmute ( object) , closure) }
178
170
}
179
-
180
- pub struct ObjectsClosure < ' a , E : ProcessEdgesWork < VM = OpenJDK > > (
181
- Vec < Address > ,
182
- & ' a mut GCWorker < OpenJDK > ,
183
- PhantomData < E > ,
184
- ) ;
185
-
186
- impl < ' a , E : ProcessEdgesWork < VM = OpenJDK > > TransitiveClosure for ObjectsClosure < ' a , E > {
187
- #[ inline]
188
- fn process_edge ( & mut self , slot : Address ) {
189
- if self . 0 . is_empty ( ) {
190
- self . 0 . reserve ( E :: CAPACITY ) ;
191
- }
192
- self . 0 . push ( slot) ;
193
- if self . 0 . len ( ) >= E :: CAPACITY {
194
- let mut new_edges = Vec :: new ( ) ;
195
- mem:: swap ( & mut new_edges, & mut self . 0 ) ;
196
- self . 1 . add_work (
197
- WorkBucketStage :: Closure ,
198
- E :: new ( new_edges, false , & SINGLETON ) ,
199
- ) ;
200
- }
201
- }
202
- fn process_node ( & mut self , _object : ObjectReference ) {
203
- unreachable ! ( )
204
- }
205
- }
206
-
207
- impl < ' a , E : ProcessEdgesWork < VM = OpenJDK > > Drop for ObjectsClosure < ' a , E > {
208
- #[ inline]
209
- fn drop ( & mut self ) {
210
- let mut new_edges = Vec :: new ( ) ;
211
- mem:: swap ( & mut new_edges, & mut self . 0 ) ;
212
- self . 1 . add_work (
213
- WorkBucketStage :: Closure ,
214
- E :: new ( new_edges, false , & SINGLETON ) ,
215
- ) ;
216
- }
217
- }
218
-
219
- pub fn scan_objects_and_create_edges_work < E : ProcessEdgesWork < VM = OpenJDK > > (
220
- objects : & [ ObjectReference ] ,
221
- worker : & mut GCWorker < OpenJDK > ,
222
- ) {
223
- let mut closure = ObjectsClosure :: < E > ( Vec :: new ( ) , worker, PhantomData ) ;
224
- for object in objects {
225
- scan_object (
226
- * object,
227
- & mut closure,
228
- VMWorkerThread ( VMThread :: UNINITIALIZED ) ,
229
- ) ;
230
- }
231
- }
0 commit comments